5

我正在构建一个简单的 java 应用程序,该应用程序涉及从 csv 文件中读取信息。csv 文件中的信息采用以下形式:

"ID","Description"
"AB","Some sort of information for AB"
"AC","Some sort of information for AC"

我需要让用户在按 ID 排序的控制台中打印出描述、ID 或两者。最简单的解决方案是使用 CSV 库(例如 opencsv)解析文件,并将这些字符串放入 TreeMap,然后打印 TreeMap 的内容。TreeMap 中的键是 ID,值是描述。

但是 CSV 文件可能很大。它可能是 5 GB,将 5 GB 的字符串加载到 TreeMap 会导致内存不足错误。为了处理大文件,我可以使用外部合并排序对文件进行排序。有一次,我得到了排序的文件,我可以通过简单地读取文件将文件的内容打印到控制台中。

外部合并排序肯定比将文件内容加载到 TreeMap 中要慢得多。我正在考虑检测文件大小。如果文件大小超过可用内存,那么我将使用外部合并排序。否则,我会将文件的内容加载到 TreeMap 中。

但是,这意味着将有两个单独的代码块执行 2 种不同的排序。因此增加了需要维护的代码量。如果您要编写此应用程序,您是否会考虑编写 2 个分开的代码来分别处理一个小的 csv 文件和一个大的 csv 文件。或者您是否只使用外部合并排序对文件进行排序而不管文件大小?

还是有这种方法的替代方法?

谢谢你。

4

2 回答 2

3

自己解析 csv 文件,仅将 ID 列添加到TreeMap, 作为值记录到该行的字节长度。之后打印使用 aRandomAccessFile读取相应的行。如果这种方法仍然会使您的内存溢出,请查看MapDB。它提供了无缝溢出到磁盘并具有出色性能的 TreeMap 实现。

于 2013-04-26T08:45:14.713 回答
1

这取决于您的老板/客户为此分配了多少时间资源。如果这不是问题,那么当然需要一个包含两部分代码的优化版本:对于较小文件的快速内存排序和对于大文件的外部排序。

当客户想要一个快速的解决方案时,你可以问他:你想要一个慢速的解决方案,它可以在无限的文件大小下工作,还是你想要一个运行速度更快但有内存限制的解决方案?- 你会得到他想要的回应,对他来说这很好:) - 如果客户满意,你也会得到回应。

也许他想要一个实现:如果软件没有全额支付,那么它将只允许最大 1GB 的文件等等。

于 2013-04-26T08:38:38.277 回答