我正在开发一个java项目,它允许用户解析可能有数千行的多个文件。解析的信息将存储在不同的对象中,然后将其添加到集合中。
由于GUI不需要一次加载所有这些对象并将它们保存在内存中,我正在寻找一种从文件加载/卸载数据的有效方法,以便数据只在加载到集合中时用户请求它。
我现在只是评估选项。我还想到了这样一种情况:在将一部分数据加载到集合中并在GUI上呈现之后,重新加载先前观察到的数据的最佳方式。重新运行解析器/填充集合/填充GUI?或者可能找到一种方法将集合保存到内存中,或者序列化/反序列化集合本身?
我知道如果执行某种数据过滤,加载/卸载数据子集会变得棘手。假设我对ID进行过滤,因此我的新子集将包含来自两个先前分析的子集的数据。这是没有问题的,我将整个数据的主副本保存在内存中。
我已经读过google-collections在处理大量数据时非常有效,并且提供了简化大量事情的方法,因此这可以提供一种替代方案,允许我将集合保存在内存中。这只是一般性的讨论。关于使用什么集合的问题是一个单独而复杂的问题。
你知道这类任务的一般建议是什么吗?我想听听你在类似情况下所做的事情。
如果需要,我可以提供更多细节。
答案 0 :(得分:4)
您可以将数据库嵌入到应用程序中,例如HSQLDB。这样你第一次解析文件然后使用SQL来做简单和复杂的查询。
HSQLDB(HyperSQL DataBase)就是 领先的SQL关系数据库引擎 用Java编写。它有一个JDBC驱动程序 并支持几乎完整的ANSI-92 SQL (BNF树格式)加上许多SQL:2008 增强。 它提供小巧,快速 提供内存的数据库引擎 和基于磁盘的表和支持 嵌入式和服务器模式。 此外,它还包括这样的工具 作为命令行SQL工具和GUI 查询工具。
答案 1 :(得分:3)
如果您有大量数据,大量文件,并且内存不足,则可以对文件进行初始扫描以对其进行索引。如果文件按换行符分成记录,并且您知道如何读取记录,则可以按字节位置索引记录。稍后,如果您想要读取某组indeces,则可以快速查找以查找需要读取的字节范围,并从File的InputStream中读取这些字节。当您不再需要这些项目时,它们将被GCed。你永远不会把更多的物品藏在堆里。
这将是一个简单的解决方案。我相信你可以找到一个库来为你提供更多的功能。