我正在写这份工作,需要从文件中读取大量数据并处理它们。目前我只是将它们保存到Set
但显然它不起作用,在运行几分钟的工作后,它吐了出来:
“内存不足:java堆”错误。
现在它让我担心阅读只是工作的开始,一旦我获得所有数据,我需要构建表来处理它,如果我甚至无法读取所有数据,如何构建这个巨大的表?我最初的计划是使用Google guava的Table类,还有其他更好的选择吗?
答案 0 :(得分:1)
正如其他人所说,如果不了解更多细节,这很难回答。由于您正在考虑使用集合来保存所有这些数据,因此听起来您不能只是逐行处理它。 “处理数据”需要表中的其他数据。
这意味着您需要某种文件支持的数据库。如果您无权访问普通的关系数据库来处理此问题,那么您可以考虑使用内存数据库,如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从该表中选择性地删除项目。