我正在写这个需要从文件中读取大量数据并处理它们的工作。目前我只是将它们保存到 aSet
但显然它不起作用,在运行了几分钟后,它吐出:
“内存不足:java 堆”错误。
现在担心读取只是工作的开始,一旦我把所有的数据都放进去,我需要建表来处理它,如果我连所有的数据都读不出来,怎么建这个巨大的表呢?我最初的计划是使用 Google guava 的 Table 类,还有其他更好的选择吗?
我正在写这个需要从文件中读取大量数据并处理它们的工作。目前我只是将它们保存到 aSet
但显然它不起作用,在运行了几分钟后,它吐出:
“内存不足:java 堆”错误。
现在担心读取只是工作的开始,一旦我把所有的数据都放进去,我需要建表来处理它,如果我连所有的数据都读不出来,怎么建这个巨大的表呢?我最初的计划是使用 Google guava 的 Table 类,还有其他更好的选择吗?
正如其他人所说,如果不了解更多细节,这很难回答。由于您正在考虑使用集合来保存所有这些数据,因此听起来您不能仅仅逐行处理它。“处理数据”可能需要表中的其他数据。
这意味着您需要某种文件支持的数据库。如果您无法访问普通的关系数据库来处理此问题,那么您可以考虑使用内存数据库,例如 H2 或 JavaDB/Derby。这些类型的数据库与您的应用程序在同一 VM 中运行,但如果您进行相应配置,它们可以使用持久存储来支持大型表。
* 编辑*
这是一些可以使用 H2 之类的代码应用的代码。(省略异常处理)
Connection connection = DriverManager.getConnection( "jdbc:h2:pruneDB");
Statement stmt = connection.createStatement();
stmt.execute("CREATE TABLE PERSON (USER_ID INT, ITEM_ID INT, BOOK_ID INT )");
stmt.close();
此时,创建一个循环来读取您的数据行并将它们插入数据库:
while( hasMoreRows() ) {
... read the three IDs you need into variables from your file ...
int bookId = someValueFromTheTextRow;
int userId = someOtherValueFromTheTextRow;
int itemId = yetAnotherValueFromTheTextRow;
// After this, just create a PreparedStatement object, bind your IDs to it, and perform an SQL
// insert into the DB table you created above
}
跳出循环后,您现在可以使用标准 SQL 从该表中选择性地删除项目。