java - 在java中存储文本文档: memory usage

标签 java list memory arraylist

我想编写自定义文本区域小部件,为此我需要找到存储文本文档的好方法。 由于我需要对其进行编辑的能力,因此我需要轻松访问任何位置的任何行和字符。

然后我的想法是将文档存储为字符列表的列表: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/

相关文章:

java - 在 java 中编写一个 tcp 代理(用于 http、smtp 或类似的)工作非 ssl 但不工作 ssl

java - 创建数组列表的 HashMap 未按预期工作

java - 在java中将列表元素分为不同的组

memory - gdb & 找出内存地址何时被写入

java - Java中的isHappy函数

java - 如何直接从bash启动java执行程序

java - Spring的DataBinder是如何用来转换普通参数值的?

c# - 根据元素的 x,y 位置打印列表内容(离散整数)

memory - 我的机器有足够的内存,但是kubernetes无法调度pod并指示内存不足

c++ - Visual Studio 15 - 是否有更好的方法来查看/解释内存窗口中的内存?