我正在使用java从文件中读取数据,将数据复制到较小的数组并将这些数组放入哈希表中。我注意到 Hashmap 消耗的内存比原始文件中的内存多(大约两倍)!知道为什么吗?
这是我的代码:
public static void main(final String[] args) throws IOException {
final PrintWriter writer = new PrintWriter(new FileWriter("test.txt",
true));
for(int i = 0; i < 1000000; i++)
writer.println("This is just a dummy text!");
writer.close();
final BufferedReader reader = new BufferedReader(new FileReader(
"test.txt"));
final HashMap<Integer, String> testMap = new HashMap<Integer, String>();
String line = reader.readLine();
int k = 0;
while(line != null) {
testMap.put(k, line);
k++;
line = reader.readLine();
}
}
最佳答案
这不是HashMap
的问题,而是一般Java对象的问题。每个对象都有一定的内存开销,包括 HashMap
中的数组和条目。
但更重要的是:字符数据消耗双倍的内存空间。原因是 Java uses 16 bits for each character ,而该文件可能采用 ASCII 或 UTF-8 编码,每个字符仅使用 7 或 8 位。
更新:对此您无能为力。您发布的代码原则上没有问题。它只是不适用于大文件。如果仔细调整 HashMap
,或者您可以使用字节数组而不是字符串来存储字符(假设所有内容都是 ASCII 或单字节 UTF-8),您可能会做得更好一些)。
但最终,要解决内存不足问题,正确的方法是重新考虑您的程序,这样您就不必立即将整个文件读入内存。
无论您对该文件的内容做什么,请考虑一下是否可以在从磁盘读取文件时执行此操作(这称为流式传输)或者也许提取相关部分并只存储它们。您还可以尝试随机访问该文件。
我建议您稍微阅读一下这些内容,尝试一些内容,然后回来提出一个针对您的应用程序的新问题。因为这个线程太长了。
关于java - Java 中的哈希表内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181366/