Java的大表

时间:2013-01-10 20:33:23

标签: java memory-management

我正在写这份工作,需要从文件中读取大量数据并处理它们。目前我只是将它们保存到Set但显然它不起作用,在运行几分钟的工作后,它吐了出来:

  

“内存不足:java堆”错误。

现在它让我担心阅读只是工作的开始,一旦我获得所有数据,我需要构建表来处理它,如果我甚至无法读取所有数据,如何构建这个巨大的表?我最初的计划是使用Google guava的Table类,还有其他更好的选择吗?

1 个答案:

答案 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从该表中选择性地删除项目。