首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java从地图中的MySQL表中检索百万条记录

使用Java从地图中的MySQL表中检索百万条记录
EN

Stack Overflow用户
提问于 2016-02-10 22:57:49
回答 2查看 595关注 0票数 0

我有以下问题:我有一个存储一些文件的应用程序,每个文件在MySQL表中创建两个条目:文件路径和一个值X(可以在文件中找到唯一标识符)。

相同的唯一标识符值也存储在文件本身中。

现在我编写了一个小程序,因为我们有一些不一致的地方,因为有些文件的路径与DB表中的路径相同,但是文件本身中的值X是不同的(文件中的值是正确的)。

我编写了一个Java应用程序:首先读取所有文件(使用DCM4CHEE库),将文件路径和值X存储在映射对象中(使用路径作为键)。然后使用查询读取MySQL表,将检索到的值(路径+值X)存储在另一个映射中,最后比较这2个映射并将不一致的记录写入文件。

不幸的是,在某些情况下,我们有超过2-3百万个文件需要读取(以及MySQL表中的记录),这使得检索非常缓慢。这些文件需要单独读取(因为它们是使用特殊文件格式(DICOM)编写的医疗记录,我需要一个特殊的库来访问内容。

我的问题是:1-是使用1存储超过300万条记录,还是使用不同的对象?有没有更有效率的东西?

2-为了从MySQL检索记录,我启动一系列限制记录数量的查询(从记录1到x,详细说明结果,然后再从x到y,精细等等)直到所有的记录都被读过。我这样做是因为一次查询检索所有记录花费了非常长的时间。我做的对吗?在Java中有更好的方法来实现这一点吗?

谢谢你们的帮助。

EN

回答 2

Stack Overflow用户

发布于 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万条记录根本不是很多。

有些事情需要检查:

  • 您的MySQL服务器是否配置得当?默认配置文件不是一个好的起点。
  • 是否有属于WHERE或ORDER子句一部分的字段的索引?
票数 0
EN

Stack Overflow用户

发布于 2016-02-10 23:18:12

您应该反转您的方法,并将新的正确数据写入MySQL。在新的表/列中或直接更新错误的数据。这样你就不用费心问你的两个问题了。在SQL中可以执行的任何操作都应该在SQL中完成。

更正:如果文件内容必须更新,而原始表可能没有更新,那么很难说哪种方法会更快。但这主要是因为尚不清楚在您的环境中如何将DB与您的技能集进行交互。

但是,如果您可以将文件内容和路径收集到csv列表中,将其上传到DB,对原始表执行连接和不匹配的内容,提取生成的记录并在循环中更新文件,可能会更快、更容易。

批量上传和下载在MySQL中非常快,循环中的文件处理不需要增加内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35327652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档