2017-02-06 4 views
-1

RAMにリロードせずにディスクに既にシリアル化されているjavaのArrayリストに要素を追加できますか?私は、XMLファイルからデータをmysqlデータベースにロードするために、データを保存するために必要です。 XMLファイルには数GBのデータがあり、問題はデータを処理するためにXMLファイルからすべてのデータを保存する必要があることです。ArrayListをJavaのRAMにロードせずにシリアライズされたArrayListに要素を追加する

+0

ArrayListは、標準のJavaシリアル化を使用してシリアル化されていますか?代わりのシリアル化?あなた自身のシリアル化? XMLファイルを元のJavaオブジェクトとしてロードするか、標準のXMLツールを使用してXMLファイルを処理するだけですか? – RealSkeptic

+0

標準Java serializazionでシリアル化したいです。私は行にXMLファイルを処理しています。ラムにロードするのは大変ですから。私はすべてのタグを分析し、配列に格納する、私はディスク上のオブジェクトにこれらの配列を直列化したいRAMのサイズがいくつかの値を超える場合 – arget888

答えて

0

ArrayListまたはその他のデータ構造体は、メモリ内のデータ構造です。したがって、このデータ構造に入れたいものは何でも、メモリ(RAM)にロードする必要があります。

メモリサイズ以上のデータをロードする方法を知りたい場合は、バッチでロードすることを検討してください。例えば最初のnのエントリをメモリ制約に合わせてロードしてから処理します。作業が終わったら、それらを破棄して次のバッチをロードするなどです。

+0

OK私はこのように行かなければならなかったが、私は誰かが可能性を知っていることを望んだそれは別のやり方で – arget888

0

私はあなたのXMLファイルが既にGBsであると思うので、より良いアプローチはチャンクのXMLファイルを読み込んで、チャンクのレコードをデータベースに保存することです。 EOFに達するまでそれを続けてください。

String encoding = "UTF-8"; 
int maxlines = 100; 
BufferedReader reader = null; 
BufferedWriter writer = null; 

try { 
    reader = new BufferedReader(new InputStreamReader(new FileInputStream("/bigfile.txt"), encoding)); 
    int count = 0; 
    for (String line; (line = reader.readLine()) != null;) { 
     if (count++ % maxlines == 0) { 
      close(writer); 
      writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/smallfile" + (count/maxlines) + ".txt"), encoding)); 
     } 
     writer.write(line); 
     writer.newLine(); 
    } 
} finally { 
    close(writer); 
    close(reader); 
} 
関連する問題