基于大文件中的字符串求和权重

时间:2013-08-13 16:49:55

标签: java algorithm file-io

我很确定此处可能已经进行了修改/类似的讨论,但我想提出我面临的确切问题以及可能的解决方案。然后我想听听你们这些更好的方法或者我如何批准我的逻辑。

问题 我有一个包含行的巨大文件。每行的格式为<weight>,<some_name>。现在我要做的是添加具有相同名称的所有对象的权重。问题是

  1. 我不知道文件中存在some_name的频率。它可能只出现一次或全部数百万可能是它
  2. 没有订购
  3. 我正在使用文件流(特定于Java,但没关系)
  4. 解决方案1 ​​:假设我有一个巨大的ram,我打算做的是逐行读取文件并在hash_map中使用名称key。如果已经存在,请另外添加。这将花费我m ram(m =文件中的行数)但整体处理速度很快

    解决方案2 :假设我没有巨大的ram,我将分批进行。读取哈希表中的第一个10,000,将其汇总并将其转储到文件中。执行文件的其余部分。完成处理文件后,我将开始阅读已处理的文件,并将重复此过程以对其进行总结。

    你们在这里建议什么?

    除了您的建议,我可以对该文件进行并行文件读取吗?我可以在这里访问FileInputStream,我可以使用fileInputStream来提高文件读取效率吗?

2 个答案:

答案 0 :(得分:2)

第二种方法无法帮助您:为了产生最终输出,您需要足够的RAM来保存文件中的所有密钥,以及表示计数的单个Integer。无论您是一步到位,还是一次几次迭代10K行,都不会改变最终所需的占用空间。

以某种方式对密钥进行分区会有所帮助,例如:按键的第一个字符。如果名称以字母开头,则处理文件26次,第一次只取得从'A'开始的密钥的权重并忽略所有其他密钥,第二次仅采用'B' s,等等上。这将使您最终得到26个不相交的文件。

另一种有效的方法是使用external sorting algorithm将无序文件转换为有序文件。这样您就可以遍历有序文件,随时计算总数,并将它们写入输出,即使不需要内存表也可以。

就优化I / O而言,我建议使用java.nio.file.Files类的newBufferedReader(Path path,Charset c)方法:它为您提供了一个针对阅读效率进行了优化的BufferedReader。 / p>

答案 1 :(得分:0)

执行此计算时文件是否为静态?如果是这样,那么您可以根据名称对文件进行磁盘排序并添加连续的条目。