我想编写自定义文本区域小部件,为此我需要找到存储文本文档的好方法。 由于我需要对其进行编辑的能力,因此我需要轻松访问任何位置的任何行和字符。
然后我的想法是将文档存储为字符列表的列表:List<List<Character>> lines
(使用ArrayList实现)。
这种方法有效,我可以轻松访问行/字符,但最让我惊讶的是内存使用情况。
我生成了一个包含 100 000 000 个字符的文件并将其加载到结构中。
List<List<Character>> lines = new ArrayList<List<Character>>();
List<Character> line;
BufferedReader br = new BufferedReader(new FileReader(file));
for(String str; (str = br.readLine()) != null; ) {
line = new ArrayList<Character>();
for (char c : str.toCharArray())
line.add(c);
lines.add(line);
}
10万个字符需要~1.1GB内存!我将它与 C# 进行了比较,采用相同的方法,并且只需要约 350 MB。
当然,考虑到事实上char
,它仍然有很多内存。在 Java/C# 中都是 2 个字节,那么 100000000 个字符 = ~190MB,其余的是 List/ArrayList 内存。
我知道 Java 是内存吞噬者,但是 Java 中怎么会占用这么多内存呢? (特别是考虑到 C# 仅占用 350mb 并且两者都是同一级别的语言) 那么还有什么更好的方式来存储文本文档呢?
编辑:
内存使用量List<StringBuilder>
:
Java
:~500MB
C#
:~300MB
C# 代码:
List<List<char>> lines = new List<List<char>>();
string str;
while ((str = file.ReadLine()) != null)
{
List<char> line = new List<char>();
foreach (char c in str)
line.Add(c);
lines.Add(line);
}
最佳答案
只需使用 ArrayList<String>
。您可以使用 charAt() 访问 String 中任何位置的任何字符,并且可以很容易地将更多字符插入到 String 中。
关于java - 在java中存储文本文档: memory usage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30985808/