我有以下问题: 我有一个应用程序存储一些文件,并且每个文件在MySQL表中创建2个条目:文件的路径,以及一个值X(可以在文件中找到唯一标识符)。
相同的唯一标识符值也存储在文件本身中。
现在我编写了一个小程序,因为我们遇到了一些不一致的问题,因为有些文件与DB表中的路径相同,但文件本身的值X不同(文件中的值是正确的)。
我编写了一个Java应用程序: 首先读取所有文件(使用DCM4CHEE库),将文件路径和值X存储在地图对象中(使用路径作为键)。 然后使用查询读取MySQL表,将检索到的值(路径+值X)存储在另一个映射中,最后比较2个映射并将不一致的记录写入文件。
不幸的是,有些情况下我们有超过2-3百万个文件需要读取(以及MySQL表中的记录),这使得检索速度非常慢。 这些文件需要单独阅读(因为它们是使用特殊文件格式(DICOM)编写的医疗记录,我需要一个特殊的库来访问内容。
我的问题是: 1 - 使用Maps来存储超过3百万条适合Java的记录,还是应该使用不同的Object?有没有更高效的东西?
2 - 从MySQL检索记录我启动了一系列限制记录数量的查询(从记录1到x,详细说明结果,然后再从x到y,详细说明等等)(y到z) ...)直到所有记录都被读取。我这样做是为了检索所有记录的单个查询花了很长时间。 我正在做的是正确的吗?在Java中有更好的方法吗?
谢谢大家的帮助。
答案 0 :(得分:0)
1 - 使用Maps来存储超过3百万条适合Java的记录,还是应该使用不同的对象?有没有更高效的东西?
只要您的流程空间中有足够的可用内存来保存数据,地图就可以了。如果每个条目平均为100个字节(对于路径加密钥的声音是正确的?),则最多需要300MB。如果每个条目都是500字节,那么您需要查看1.5GB。
2 - 从MySQL检索记录我启动了一系列限制记录数量的查询(从记录1到x,详细说明结果,然后再从x到y,详细说明等等)(y到z) ...)直到所有记录都被读取。我这样做是为了检索所有记录需要很长时间。
在单个查询中读取所有记录通常应该没有问题(尽管如果你在ORDER BY,在某些情况下可能会变得相对昂贵)。对于具有适当硬件和正确配置的MySQL系统,2-3百万条记录并不多。
要检查的一些事项:
答案 1 :(得分:0)
您应该反转您的方法并将新的正确数据写入MySQL。在新表/列中或直接更新错误数据。这样你就不用担心这两个问题了。任何可以在SQL中完成的事情都应该在SQL中完成。
更正:如果必须更新文件内容而原始表可能不更新,那么很难说哪种方法会更快。但这主要是因为不清楚您的环境中的数据库与您的技能组合如何高效。
如果您可以将文件内容和路径收集到csv列表中,将其上传到数据库,在路径上执行连接以及将不匹配的内容添加到原始表,提取结果记录并更新文件,那么它仍然可以更快更轻松在一个循环中。
使用MySQL进行批量上传和下载非常快,并且循环中的处理文件不会占用内存。