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

标签 java algorithm file-io

我很确定这里可能已经进行了修改/类似的讨论,但我想提出我所面临的确切问题以及我这边可能的解决方案。然后我想听听你们说什么是更好的方法或者我怎样才能批准我的逻辑。

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

  1. 我不知道有多频繁some_name存在于文件中。它可能只出现一次,也可能是数百万次中的全部
  2. 没有订购
  3. 我正在使用文件流(特定于 java,但这并不重要)

解决方案 1:假设我有巨大的 ram,我打算做的是逐行读取文件并使用名称 key在我的 hash_map 中。如果它已经存在,请对其进行总结,否则添加。这会花费我 m ram(m = 文件中的行数)但整体处理速度会很快

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

你们在这里有什么建议?

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

最佳答案

第二种方法对您没有帮助:为了生成最终输出,您需要足够的 RAM 来保存文件中的所有 key ,以及一个 Integer。代表计数。无论您是要迈出一大步还是通过一次 10K 行的多次迭代来实现它,都不会改变您最终需要的占用空间。

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

另一种有效的方法是使用 external sorting algorithm将无序文件转换为有序文件。这将使您遍历有序文件,边走边计算总数,并将它们写入输出,甚至不需要内存表。

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

关于java - 基于大文件中的字符串求和权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18214809/

相关文章:

java - 如何生成介于 1 和任何值之间的随机 BigInteger 数字?

c - 将矩形划分为较小矩形的算法?

string - 如何有效地检查两个字符串之间的 Levenshtein 编辑距离是否为 1

java - 从文本文件中读取行并将它们排序到链接列表中java

java - 我想要为我的 Java 编码 Telegram 机器人提供粗体文本,如何实现?

Java RMI 分层接口(interface)

java - 更改 libgdx 中的渲染频率

java - 获取颜色边界之间所有像素的算法?

c++ - 如何在大文件上有效地使用文件输入/输出函数(使用有限大小的内存)

ruby-on-rails - 如何使用 Ruby 删除文本文件中间的数据行