0

私は、ファイルから大量のデータを読み取り、それらを処理する必要があるこのジョブを書いています。現在、私はそれらを保存しますSetが、明らかに機能しません。ジョブを数分間実行した後、吐き出されます。

「メモリ不足:Javaヒープ」エラー。

今、読み取りは仕事の始まりに過ぎないのではないかと心配しています。すべてのデータを取得したら、それを処理するためのテーブルを作成する必要があります。すべてのデータを読み取ることさえできない場合は、この巨大なテーブルを作成する方法を教えてください。私の当初の計画はGoogleguavaのTableクラスを使用することですが、他にもっと良いオプションはありますか?

4

1 に答える 1

1

他の人が言っているように、これは詳細を知らずに答えるのはかなり難しいです。コレクションを使用してこのすべてのデータを保持することを検討しているため、単に行ごとに処理することはできないようです。「データの処理」には、テーブル内の他のデータが必要になる可能性があります。

つまり、ある種のファイルでバックアップされたDBが必要です。これを処理するための通常のリレーショナルデータベースにアクセスできない場合は、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();

この時点で、データの行を読み取り、それらをDBに挿入するループを作成します。

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を使用して、そのテーブルからアイテムを選択的に削除できます。

于 2013-01-10T20:50:11.263 に答える