在我工作的地方,曾经有每个文件超过百万行的文件。尽管服务器内存超过 10GB,而 JVM 内存为 8GB,但有时服务器会挂起片刻并阻塞其他任务。
我分析了代码,发现虽然文件读取内存使用率经常增加千兆字节(1GB 到 3GB),然后突然恢复正常。似乎这种频繁的高低内存使用会挂起我的服务器。当然,这是由于垃圾收集。
我应该使用哪个 API 来读取文件以获得更好的性能?
现在我BufferedReader(new FileReader(...))
用来阅读这些 CSV 文件。
过程:我如何读取文件?
- 我逐行读取文件。
- 每行都有几列。基于我相应地解析它们的类型(double中的成本列,int中的访问列,String中的关键字列等)。
- 我在 HashMap 中推送符合条件的内容(访问 > 0),最后在任务结束时清除该 Map
更新
我读取 30 或 31 个文件(一个月的数据)并将符合条件的文件存储在地图中。后来这张地图被用来在不同的桌子上找到一些罪魁祸首。因此读取是必须的,存储数据也是必须的。虽然我现在已经将 HashMap 部分切换到 BerkeleyDB,但是读取文件时的问题是相同的,甚至更糟。