我有以下问题:我有一个存储一些文件的应用程序,每个文件在MySQL表中创建两个条目:文件路径和一个值X(可以在文件中找到唯一标识符)。
相同的唯一标识符值也存储在文件本身中。
现在我编写了一个小程序,因为我们有一些不一致的地方,因为有些文件的路径与DB表中的路径相同,但是文件本身中的值X是不同的(文件中的值是正确的)。
我编写了一个Java应用程序:首先读取所有文件(使用DCM4CHEE库),将文件路径和值X存储在映射对象中(使用路径作为键)。然后使用查询读取MySQL表,将检索到的值(路径+值X)存储在另一个映射中,最后比较这2个映射并将不一致的记录写入文件。
不幸的是,在某些情况下,我们有超过2-3百万个文件需要读取(以及MySQL表中的记录),这使得检索非常缓慢。这些文件需要单独读取(因为它们是使用特殊文件格式(DICOM)编写的医疗记录,我需要一个特殊的库来访问内容。
我的问题是:1-是使用1存储超过300万条记录,还是使用不同的对象?有没有更有效率的东西?
2-为了从MySQL检索记录,我启动一系列限制记录数量的查询(从记录1到x,详细说明结果,然后再从x到y,精细等等)直到所有的记录都被读过。我这样做是因为一次查询检索所有记录花费了非常长的时间。我做的对吗?在Java中有更好的方法来实现这一点吗?
谢谢你们的帮助。
发布于 2016-02-10 23:04:33
1-使用Maps存储300多万条记录是否适合于Java,还是应该使用不同的对象?有没有更有效率的东西?
只要您在进程空间中有足够的可用内存来保存数据,映射就应该是可以的。如果每个条目平均为100个字节(听起来对路径加键来说差不多合适?),则需要最多300 to。如果每个条目都是500个字节,那么您将看到1.5GB。
2-为了从MySQL检索记录,我启动一系列限制记录数量的查询(从记录1到x,详细说明结果,然后再从x到y,精细等等)直到所有的记录都被读过。我这样做是因为一次查询检索所有记录花费了非常长的时间。
在单个查询中读取所有记录通常不会有问题(尽管如果您订购BY,在某些情况下这可能会变得比较昂贵)。对于一个拥有适当硬件和适当配置的MySQL系统来说,230万条记录根本不是很多。
有些事情需要检查:
发布于 2016-02-10 23:18:12
您应该反转您的方法,并将新的正确数据写入MySQL。在新的表/列中或直接更新错误的数据。这样你就不用费心问你的两个问题了。在SQL中可以执行的任何操作都应该在SQL中完成。
更正:如果文件内容必须更新,而原始表可能没有更新,那么很难说哪种方法会更快。但这主要是因为尚不清楚在您的环境中如何将DB与您的技能集进行交互。
但是,如果您可以将文件内容和路径收集到csv列表中,将其上传到DB,对原始表执行连接和不匹配的内容,提取生成的记录并在循环中更新文件,可能会更快、更容易。
批量上传和下载在MySQL中非常快,循环中的文件处理不需要增加内存。
https://stackoverflow.com/questions/35327652
复制相似问题