簡體   English   中英

Java中的巨大字符串表

[英]Huge String Table in Java

我有一個關於在應用程序內存中存儲大量字符串的問題。 我需要從文件中加載大約5百萬行,每行最多255個字符(url),但大多數是〜50。 我有時需要搜索其中一個。 是否有可能在~1GB的RAM上運行這個應用程序?

ArrayList <String> list = new ArrayList<String>();

工作?

據我所知,java中的String是用UTF-8編碼的,這給了我巨大的內存使用量。 是否可以使用ANSI編碼的字符串來生成這樣的數組?

這是使用參數運行的控制台應用程序

java -Xmx1024M -Xms1024M -jar "PServer.jar" nogui

最新的JVM默認支持-XX:+UseCompressedStrings ,它存儲僅在內部使用ASCII作為byte []的字符串。

列表中有幾GB的文本不是問題,但從磁盤加載可能需要一段時間(很多秒)

如果平均URL是50個字符,這些字符是ASCII,每個字符串有32個字節的開銷,則5個條目可以使用大約400 MB,這對於現代PC或服務器來說並不多。

Java String是一個完整的對象。 這意味着appart來自字符串的字符,還有其他信息存儲在其中(指向對象類的指針,指向它的指針數量的計數器,以及一些其他基礎結構數據)。 所以一個空的String已經在內存中占用了45個字節 (正如你在這里看到的)。 現在您只需添加字符串的最大長度並進行一些簡單的計算即可獲得該列表的最大內存。

無論如何,如果你有內存問題,我建議你把字符串加載為byte [] 這樣你就可以控制編碼,你仍然可以進行搜索。

是否有某些原因需要將其限制為1G? 如果你想搜索它們,你肯定不想換到磁盤,但如果機器有更多的內存,那么高於1G是有意義的。

如果必須搜索,請使用SortedSet ,而不是ArrayList

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM