java - 如何优化大文件处理的内存使用

标签 java heap-memory

我有一个文件,我正在从文件中填充 HashMap<String, ArrayList<Objects>> 。 HashMap 的大小肯定是 25,意味着 25 个键,但是 List 会很大,比如每个键有一百万条记录。

所以我现在要做的是为每个键检索记录列表并使用线程并行处理它们。事情进展顺利,直到我面对更大的文件,所以我面临“java.lang.OutOfMemoryError:Java堆空间”。

我想问你用对象列表填充 HashMap 的最佳方法是什么?我的想法是获取文件的 25 个偏移量,而不是将从文件中读取的行放入 arrayList 中,而是放入文件的偏移量并为每个线程提供一个迭代器,以从其起始偏移量迭代到结束偏移量。这个想法我还是要尝试一下。但在执行之前,我想知道有什么更好的方法来优化内存使用。

最佳答案

I will populate the HashMap<String, ArrayList<Objects>>

填充 HashMap 后你需要用它做什么?我相信仅仅填充 map 并不是您的任务。无论什么情况,您都不需要读取内存中的整个文件。

增加堆大小可能不是一个好的解决方案,因为有一天您可能会得到比堆大小更大的文件。

使用BufferedReader以 block 的形式读取文件或BufferedInputStream根据您的需要并在阅读时完成您的任务。这两个API一次只能读取内存中文件的一部分。

I read from file into the arrayList, put the offset of the file and give each thread an iterator to iterate from its start offset to end offset. I still have to try this thought.

使用多线程不会阻止 java.lang.OutOfMemoryError因为所有线程都在同一个 JVM 中。而且,无论是在一个列表还是多个列表中读取文件,该文件中的所有数据都会被读取到同一个堆内存中。

如果您提到您实际上想如何处理文件中的数据,这个答案可能会更具体。

关于java - 如何优化大文件处理的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37581409/

相关文章:

c++ - 动态内存分配的限制

java.lang.OutOfMemoryError : PermGen space Exception 错误

java - 防止 JavaFX 对话框关闭

java - OSGi:BND 工具无法仅 @Reference 特定组件

java - 从 2.6 升级到 3.7 时出现 BIRT JDBCException "Cannot load JDBC Driver class: com.mysql.jdbc.Driver"

java - HTTP 请求处理程序连接重置错误

java - 编码 xml 文件时到底发生了什么

java - 解释 VisualVM 分析 session 的结果

java - Maven 中的空闲堆大小不会增加

C,读取文本文件时字符串中的垃圾/垃圾值