根据需要将数据从文件加载到集合的最有效方法是什么?

时间:2010-03-12 18:41:02

标签: java performance collections guava memory-efficient

我正在开发一个java项目,它允许用户解析可能有数千行的多个文件。解析的信息将存储在不同的对象中,然后将其添加到集合中。

由于GUI不需要一次加载所有这些对象并将它们保存在内存中,我正在寻找一种从文件加载/卸载数据的有效方法,以便数据只在加载到集合中时用户请求它。

我现在只是评估选项。我还想到了这样一种情况:在将一部分数据加载到集合中并在GUI上呈现之后,重新加载先前观察到的数据的最佳方式。重新运行解析器/填充集合/填充GUI?或者可能找到一种方法将集合保存到内存中,或者序列化/反序列化集合本身?

我知道如果执行某种数据过滤,加载/卸载数据子集会变得棘手。假设我对ID进行过滤,因此我的新子集将包含来自两个先前分析的子集的数据。这是没有问题的,我将整个数据的主副本保存在内存中。

我已经读过google-collections在处理大量数据时非常有效,并且提供了简化大量事情的方法,因此这可以提供一种替代方案,允许我将集合保存在内存中。这只是一般性的讨论。关于使用什么集合的问题是一个单独而复杂的问题。

你知道这类任务的一般建议是什么吗?我想听听你在类似情况下所做的事情。

如果需要,我可以提供更多细节。

2 个答案:

答案 0 :(得分:4)

您可以将数据库嵌入到应用程序中,例如HSQLDB。这样你第一次解析文件然后使用SQL来做简单和复杂的查询。

  

HSQLDB(HyperSQL DataBase)就是   领先的SQL关系数据库引擎   用Java编写。它有一个JDBC驱动程序   并支持几乎完整的ANSI-92 SQL   (BNF树格式)加上许多SQL:2008   增强。 它提供小巧,快速   提供内存的数据库引擎   和基于磁盘的表和支持   嵌入式和服务器模式。   此外,它还包括这样的工具   作为命令行SQL工具和GUI   查询工具。

答案 1 :(得分:3)

如果您有大量数据,大量文件,并且内存不足,则可以对文件进行初始扫描以对其进行索引。如果文件按换行符分成记录,并且您知道如何读取记录,则可以按字节位置索引记录。稍后,如果您想要读取某组indeces,则可以快速查找以查找需要读取的字节范围,并从File的InputStream中读取这些字节。当您不再需要这些项目时,它们将被GCed。你永远不会把更多的物品藏在堆里。

这将是一个简单的解决方案。我相信你可以找到一个库来为你提供更多的功能。