如何在 Java 中处理大数据?
Posted
技术标签:
【中文标题】如何在 Java 中处理大数据?【英文标题】:How to Handle Large Data in Java? 【发布时间】:2013-08-21 18:26:42 【问题描述】:我的应用程序需要使用最大为 5 GB 的文本文件中的数据。我无法将所有这些数据加载到 RAM 中,因为它太大了。
数据以表格形式存储,有 500 万条记录(行)和 40 列,每列包含将在内存中转换为字符串、整数或双精度的文本。
我尝试在内存中仅缓存 10 - 100 MB 的数据,并在需要外部数据时从文件中重新加载,但这太慢了!当我运行计算时,因为我可以从表中的任何行随机跳转,所以它需要不断地打开文件、读取和关闭。
我需要一些快速的东西,我正在考虑使用某种数据库。我知道这样的大数据计算可能需要一段时间,这很好。如果我确实使用了数据库,则需要在启动桌面应用程序时进行设置,并且之前不需要安装某种服务器组件。
有什么建议吗?谢谢
【问题讨论】:
你应该使用 SQLite。 记录的大小是否固定?外部数据库系统是可接受的解决方案吗? 不是固定大小,可以随时更改我加载不同的文件。 【参考方案1】:我认为你需要澄清一些事情:
这是桌面应用程序(我假设是),它的内存限制是多少? 您是否在只读模式下使用您的文件? 您要进行什么样的计算? (随机行的访问频率,后续行的读取频率,是否需要修改数据)目前我看到了两种进一步调查的方法:
使用SQLite。这是一个小型单文件数据库,主要面向桌面应用程序和单用户使用。它不需要任何服务器,您只需要拥有合适的 jdbc 库即可。 创建某种索引,例如使用二叉树。第一次读取文件时,索引文件中行的起始位置。与永久打开的random access file 结合使用,这将帮助您快速查找和阅读所需的行。对于二叉树,您的索引可能约为 120M。 (二叉树的 RowsCount * 2 * IndexValueSize)【讨论】:
您好,感谢您的回复。是的,它是一个桌面应用程序,内存限制在 2 GB 左右。文件是只读的 计算在用户请求完成时完成,当他们选择这样做时,计算线程将运行并将遍历每条数据(从文件加载的表中的单元格),直到完成。话虽如此,还有另一个计算函数可以随机访问多达几千行。 从您的文件中“即时”创建数据库表将是相当繁重的操作。如果您可以更改数据的存储方式,我建议将“文件中的表”完全替换为一些轻量级数据库(例如 SQLite)中的表。 另外,您可以考虑创建一些预计算。我不知道你做了什么确切的计算,但试着想想你是否可以以某种方式聚合你的数据,以便它可以放入内存中。但无论如何,使用轻量级数据库进行数据存储似乎是最便宜、最快的解决方案。【参考方案2】:您可以使用嵌入式数据库,您可以在这里找到比较:Java Embedded Databases Comparison。
或者,根据您的用例,您甚至可以尝试使用Lucene,它是一个全文搜索引擎。
【讨论】:
谢谢,我去看看H2。 SQlite 有什么缺点吗? @user2704766 不知道,只是另一个链接;)database-management-systems.findthebest.com/compare/16-53/…以上是关于如何在 Java 中处理大数据?的主要内容,如果未能解决你的问题,请参考以下文章