首页
学习
活动
专区
圈层
工具
发布

Java大表
EN

Stack Overflow用户
提问于 2013-01-10 20:33:22
回答 1查看 308关注 0票数 0

我正在编写这份工作,需要从文件中读取大量数据并对其进行处理。目前,我只是将它们保存到一个Set中,但是很明显它不起作用,在运行作业几分钟之后,它会发出:

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

现在让我担心的是,阅读仅仅是工作的开始,一旦我把所有的数据都输入进去,我就需要构建这个表来处理它,如果我连所有的数据都看不懂,该如何构建这个巨大的表呢?我最初的计划是使用谷歌番石榴的Table类,还有其他更好的选择吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-10 20:50:11

正如其他人所说,在不知道更多细节的情况下,这是很难回答的。由于您正在考虑使用一个集合来保存所有这些数据,听起来您不可能仅仅一行地处理它。“处理数据”可能需要表中的其他数据。

这意味着您需要某种类型的文件支持DB。如果您无法访问普通的关系数据库来处理这个问题,那么您可以考虑使用内存中的数据库,比如H2或JavaDB/Derby。这些类型的数据库运行在与应用程序相同的VM中,但如果您相应地进行配置,它们可以使用持久存储来备份大型表。

*编辑 *

下面是一些代码,这些代码可以使用类似于H2的东西来应用。(省略异常处理)

代码语言:javascript
复制
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();

此时,创建一个循环,读取数据行并将它们插入DB:

代码语言:javascript
复制
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从该表中选择删除项。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14266768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档