gpt4 book ai didi

Java 内存 : Object consumes thrice the size it should

转载 作者:行者123 更新时间:2023-12-04 05:54:33 26 4
gpt4 key购买 nike

考虑一个带有静态工厂方法的类,它获取一个 CSV(或 TSV)行作为输入(为方便起见重命名变量名):

String[] fields=StringUtils.split(tsvLine, '\t');
return new MYObject(
Integer.parseInt(fields[0]),
StringUtils.strip(fields[1], "\"").intern(), // Many duplicates
StringUtils.strip(fields[2], "\""), // Unique
StringUtils.strip(fields[4], "\"").intern(), // Many duplicates
Double.parseDouble(fields[7]),
Double.parseDouble(fields[6]));

此方法从大小约 500 MB 的文件中解析大约 500 万条记录。为了节省内存,我保存了三个串联起来的字符串:

我尝试了以下优化:

public MyObject(int i1, String str0, String str1, String str2, 
double d1, double d2)
{
...
this.tsvStrings = (str0+'\t'+str1+'\t'+str2).toCharArray();
...
}

(当然,这些在适当的 getter 和 setter 中是分开的)。

进程大小仍然远远超过 1GB,尽管它的大部分内容都被忽略了。优化这个的最佳方法是什么?我是否保留了不必要的引用资料?

编辑 : str0 和 str2 有重复,str1 是唯一的。

最佳答案

如果您有一个使用 UTF-8 编码的文件,默认情况下它将使用大约两倍的内存(因为它在内存中使用 UTF-16)。那是因为 String 和 StringBuilder 每个字符使用两个字节(对于大多数字符)

如果您操作该数据,则可能需要两倍或更多的内存。

您可以使用内存映射文件和纯字节等使处理更加紧凑,但考虑到 16 GB 的内存成本约为 100 英镑,使用更多内存可能会更好地利用您的时间。

关于Java 内存 : Object consumes thrice the size it should,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670317/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com