2012-07-10 43 views
2

在我的程序中,我正在從磁盤讀取一系列文本文件。對於每個文本文件,我會處理掉一些數據並將結果作爲JSON存儲在磁盤上。在這個設計中,每個文件都有自己的JSON文件。除此之外,我還將一些數據存儲在單獨的JSON文件中,該文件存儲來自多個文件的相關數據。我的問題是共享JSON隨着每個文件的解析而變得越來越大,並最終使用了太多的內存。我在32位機器上,擁有4 GB的RAM,並且無法再增加Java VM的內存大小。我的JSON文件太大而無法放入內存,我該怎麼辦?

要考慮的另一個約束是我經常回頭引用舊的JSON。例如,說我從FileY中取出ObjX。在僞代碼,將出現以下情況(使用傑克遜JSON序列化/反序列化):

// In the main method. 
FileYJSON = parse(FileY); 
ObjX = FileYJSON.get(some_key); 
sharedJSON.add(ObjX); 

// In sharedJSON object 
List objList; 

function add(obj) 
    if (!objList.contains(obj)) 
     objList.add(obj); 

我能想到做的唯一事情是使用流JSON,但問題是,我經常需要訪問的JSON之前來過,所以我不知道那個流會起作用。此外,我的數據類型不僅是字符串,這阻止了我使用Jackson的流媒體功能(我相信)。有誰知道一個好的解決方案?

+1

也許是時候重新考慮你的數據結構了。尋找更好的設計(更模塊化)可以減輕機器的需求。 – SJuan76 2012-07-10 21:45:12

+0

獲取更多內存或更小的文件。 – duffymo 2012-07-10 22:15:22

+0

如果你將所有的數據儲存在內存中,那麼流式傳輸只會給你多一點時間。找到方法來拋棄你不再需要的東西。 – phatfingers 2012-07-10 22:48:51

回答

2

如果您的數據結構太大以至於內存不足,則必須開始使用其他內容。我建議您使用一個數據庫,這將顯着加快數據檢索和存儲。它也將使您的數據結構的限制成爲您硬盤的大小,而不是RAM的大小。

嘗試this page瞭解Java和數據庫的介紹。

1

我不敢相信你真的只需要接近4GB的RAM只用於文本文件和JSON。

我看到三種可能的解決方案。

  1. 如果可能,請切換爲純文本。那不是那種飢餓的記憶。
  2. 只需根據需要打開和關閉文件即可。您可以將文件命名爲特定的命名約定,如散列的前兩個/三個/ ...數字,並在需要時打開它們。
  3. 如果你有這麼多的數據,你可能會切換到數據庫。這將節省大量資源。

如果可能,我寧願選擇3。

相關問題