java - 合并大文件的算法

标签 java sorting file merge

我有几个事件日志文件(每行一个事件)。日志可能会重叠。日志是在可能来自多个时区的不同客户端计算机上生成的(但我假设我知道时区)。每个事件都有一个时间戳,该时间戳已标准化为公共(public)时间(通过使用适合日志文件的时区实例化每个日志解析器日历实例,然后使用 getTimeInMillis 获取 UTC 时间)。日志已按时间戳排序。多个事件可以同时发生,但绝不是等同的事件。

这些文件可能相对较大,例如单个日志中有 500000 个或更多事件,因此将日志的全部内容读入一个简单的 Event[] 是不可行的。

我正在尝试做的是将每个日志中的事件合并到一个日志中。这有点像合并排序任务,但每个日志都已经排序,我只需要将它们放在一起即可。第二个组成部分是可以在每个单独的日志文件中看到相同的事件,我想在文件输出日志中“删除重复事件”。

这是否可以“就地”完成,例如,按顺序处理每个日志文件的一些小缓冲区?我不能简单地将所有文件读入 Event[],对列表进行排序,然后删除重复项,但到目前为止,我有限的编程能力只能让我将此视为解决方案。当我同时从每个日志中读取事件时,是否可以使用一些更复杂的方法来执行此操作?

最佳答案

  1. 读取每个日志文件的第一行

  2. 循环

    一个。找到“最早”的行。

    将“最早”行插入主日志文件

    从包含最早行的文件中读取下一行

您可以检查 b 和 c 之间的重复项,为每个文件推进指针。

关于java - 合并大文件的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/128043/

相关文章:

java - 处理大数组的多线程计算

java - 基于 no 的线程配置。 CPU 核心数

java - Ping 端口号测试服务器套接字接受功能

c++ - C++ 中的归并排序 : Unable to pass array in merge function - invalid conversion to 'int*'

node.js - Node Express 从二进制字符串中保存 pdf

java - 是否有一个通用的数据结构来表示 Java 中的列表映射

c - 通过冒泡排序机制得到两个簇

arrays - 二维数组排序问题

读取字节数组中的文件时出现 Java 堆空间错误

c - 学习处理文件。试图想出一种维护文件指针位置的方法