2

Javaのテキストファイルをメモリにロードしています。テキスト ファイルのサイズは 100 MB で、文字列、整数、または倍精度型の数千行が含まれています。

64ビットJDKを使用してコンパイルすると、メモリにロードされると1GB以上を占有します。

さらに大きなファイルをロードする必要があるため、これは問題です。

それらは、配列リストに正確なデータ型として格納されます。私はMemoryMappedFilesを見ましたが、必要な機能を提供するかどうかはわかりません.テキストファイルは、JTableに表示する必要がある40列でタブ区切りされています. JTable に表示する必要がありますが、間違っている可能性があります。

任意の提案をいただければ幸いです。

データは次のように保存されます。すべてをメモリに格納する必要があるのは、計算のためにいつでもファイル内の行にアクセスする必要があるためです。

これは JTable のテーブル モデルにあります。メモリ内に重複コピーがないことを確認するために、テーブルモデルに渡された行データが null になっていることに注意してください。

private Object[][] data;

public TableModel(ArrayList<String> headers, RowData[] importedData)
{                
   columnNames = new String[headers.size()];
   data = new Object[importedData.length][headers.size()];

   for (int i = 0; i < headers.size(); i++) // extract the column names
    {                                        // for the table
        this.columnNames[i] = headers.get(i);
    }

   for (int i = 0; i < importedData.length; i++)  // extracting the data
   {                                              // for the table
       for (int j = 0; j < headers.size(); j++)
       {
            this.data[i][j] = importedData[i].myList.get(j);
       }
   }
}
4

3 に答える 3

2

メモリ構造で多くの小さなオブジェクトを使用していると思います。おそらくそれはあなたにオーバーヘッドを与えます。私の経験から、メモリ消費を削減する最良の方法はプレーン配列を使用することです。この配列を他の構造にラップできます。このアプローチを使用すると、70% のメモリを節約できます。これはきれいなコードではありませんが、メモリを節約する必要がある場合は機能します。

また、ファイルから 1 行ずつデータを読み取ります。次の行が読み取られた後、このデータを構造体に入れます。

たとえば、id と name の 2 つのフィールドが必要な場合は、次のようなものを作成できます。

public class DataStructure {

    private final static int SIZE_STEP = 32;

    private int size = 0;
    private int[] ids = new int[SIZE_STEP];
    private String[] names = new String[SIZE_STEP];

    public void add(int id, String name) {
        if(size >= ids.length) {
            ids = Arrays.copyOf(ids, ids.length + SIZE_STEP);
            names = Arrays.copyOf(names, names.length + SIZE_STEP);
        }
        ids[size] = id;
        names[size] = name;
        size++;
    }

    public int getId(int index) {
        return ids[index];
    }

    public String getName(int index) {
        return names[index];
    }
}

他のアプローチはページネーションです。たとえば、20 件のレコードのみを表示し、ページ ナビゲーションを提供する場合。

于 2013-08-20T07:32:02.160 に答える