3

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

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

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

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

我读过 google-collections 在处理大量数据时既好又高效,并提供了简化很多事情的方法,因此这可能提供一种替代方法,让我可以将集合保存在内存中。这只是泛泛而谈。关于使用什么集合的问题是一个单独且复杂的事情。

你知道这类任务的一般建议是什么吗?我想听听你对类似场景做了什么。

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

4

2 回答 2

4

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

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

于 2010-03-12T19:07:39.663 回答
3

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

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

于 2010-03-12T18:48:46.920 回答