我想用Java(儘可能少的內存和儘可能快的訪問)有效地加載大型CSV格式的文件(通常爲200-600mb)。目前,該程序正在使用一串字符串列表。此操作之前是通過一個Lua程序處理的,每個CSV行使用一個表格來保存每個「行」表格。Java - 如何有效地存儲大量的字符串數組
下面是對存儲器的差異和加載時間的示例:
- CSV文件 - 232mb
- 的Lua - 549mb在存儲器 - 157秒加載
- 爪哇 - 1,378mb在存儲器 - 12加載的秒數
如果我沒記錯的話,Lua表中的重複項存在作爲對實際值的引用。我懷疑在Java的例子中,List持有每個重複值的單獨副本,這可能與更大的內存使用有關。
下面是CSV文件內的數據的一些背景:
- 每個字段包括一字符串的
- 每行內的特定字段可以包括一組字符串(例如,字段中的一個3可以是「紅」,「綠」或「藍」)。
- 還有很多重複內容中的字符串。
下面是什麼,可能需要加載的數據的一些例子:
- 搜索通過試圖匹配給定的字符串,返回匹配的字符串在GUI
- 顯示匹配的所有字符串表(可通過字段排序)。
- 改變或替換字符串。
我的問題 - 是否有一個需要更少的內存來保存數據,但仍然提供功能,以方便,快速地搜索/排序數據的集合?
如果你知道該列3只持有少數可能的值,你可以[實習生他們(http://docs.oracle .com/javase/7/docs/api/java/lang/String.html#intern%28%29)以減少內存使用量。另請參閱:http://stackoverflow.com/a/1855195/829571 – assylias
感謝assylias我將運行一些測試使用它。你知道它是否對短字符串有效 - 例如「去」或「去」。大多數字段包含45個字符的字符串,但有些字符串很短(4個或更少)。 – user1816198
看看http://stackoverflow.com/questions/12792942/alternatives-to-java-string-interning –