2

我的应用程序需要使用大小高达5 GB的文本文件中的数据。我无法将所有这些数据加载到RAM中,因为它太大了。如何在Java中处理大数据?

数据存储为一个表格,500万条记录(行)和40列,每个记录包含将在内存中转换为字符串,整数或双精度的文本。

我试过缓存只有10 - 100 MB的数据在内存中,并从文件重新加载时,我需要外面的数据,但它太慢了!当我运行计算时,因为我可以从表中的任意行随机跳转,它将不断需要打开文件,读取和关闭。

我需要的东西很快,我正在考虑使用某种数据库。我知道像这样的大数据计算可能需要一段时间,这很好。如果我使用数据库,则需要在启动桌面应用程序时进行设置,而不需要以前安装某种服务器组件。

任何提示?谢谢

+1

您应该使用SQLite。 – SLaks

+0

记录是否有固定大小?外部数据库系统是可接受的解决方案吗? – Joni

+0

不是一个固定的大小,可以随时更改我加载一个不同的文件。 – user2704766

回答

2

我认为你需要澄清一些事情:

  • 这是桌面应用程序(我认为是),什么是它的内存限制?
  • 你是否以只读模式使用你的文件?
  • 你想要做什么样的计算? (随机行的访问频率,随之而来的行如何经常阅读,你需要修改数据)

目前我看到进一步调查两种方式:

  • 使用SQLite。这是一个小型的单文件数据库,主要面向桌面应用程序和单用户使用。它不需要任何服务器,只需要有适当的jdbc库。
  • 使用例如二叉树创建某种索引。第一次读取文件时,索引文件中行的起始位置。结合永久打开random access file这将帮助您快速寻找并快速读取所需的行。对于二叉树,您的索引可能大约为120M。 (它是二叉树的RowsCount * 2 * IndexValueSize)
+0

嗨,谢谢你的回应。 是的,它是一个桌面应用程序,内存限制在2 GB左右。 文件是只读的 计算是在用户请求完成时完成的,当他们选择这样做时,计算线程将运行,并将遍历每个数据段(从文件加载的表中的单元格),直到它完成。这就是说有另一种计算功能,可以随机访问多达几千行。 – user2704766

+0

从您的文件“正在运行”创建数据库表将是相当繁重的操作。如果你可以改变数据存储方式,我建议用一些轻量级数据库(比如SQLite)中的表来完全替换“文件中的表”。 – Aivean

+0

或者你可以考虑创建一些预计算。我不知道你做了什么确切的计算,但试着想一下,如果你能以某种方式聚合你的数据,这样它可以适应内存。 但无论如何,使用轻量级数据库进行数据存储似乎是最便宜且速度最快的解决方案。 – Aivean

2

你可以使用嵌入式数据库,你可以在这里找到一个比较:Java Embedded Databases Comparison

或者,根据您的使用情况,您甚至可以尝试使用Lucene这是一个全文搜索引擎。

+0

谢谢,我会看看H2。 SQlite有什么缺点? – user2704766

+0

@ user2704766不知道,只是另一个链接;)http://database-management-systems.findthebest.com/compare/16-53/H2-vs-SQLite – Katona