代码之家  ›  专栏  ›  技术社区  ›  f1sh

根据时间戳对多个文件的行进行排序+合并

  •  -1
  • f1sh  · 技术社区  · 15 年前

    我有多个文本文件,它们代表日志记录条目,稍后需要分析这些条目。每个文件的大小可达1米,我有大约10个文件。 每行的格式如下:

    Timestamp\tData
    

    我必须合并所有文件并按时间戳值对条目进行排序。无法保证1个文件的条目按正确的时间顺序排列。

    最聪明的方法是什么?我的伪代码如下:

    List<FileEntry> oneBigList = new ArrayList<FileEntry>();
    for each file {
      parse each line into an instance of FileEntry;
      add the instance to oneBigList;
    }
    Collections.sort(oneBigList according to FileEntry.getTimestamp());
    
    2 回复  |  直到 12 年前
        1
  •  2
  •   rsp    15 年前

    如果您不确定您的任务是否适合可用的内存,最好在分析后插入行到数据库表中,让数据库担心如何排序数据(timestamp列上的索引将有助于:-)

    如果你确定记忆没有问题,我会用 TreeMap 在添加行的同时进行排序。

    确保FileEntry类实现 hashCode() , equals() Comparable 按照你的分类顺序。

        2
  •  0
  •   Edwin Buck    12 年前

    在每个文件中,您可以假定条目是按时间顺序排列的,因为“下一行”写在“上一行”之后。

    这意味着您可能应该实现合并排序。最好将两个最小的文件合并排序,然后重复,直到有一个文件为止。

    请注意,如果这些文件来自多台计算机,您仍然会使日志无序;因为,除非机器时钟通过某种可靠的方法进行同步,否则时钟将有所不同。即使它们是同步的,时钟也会有所不同;然而,它们之间的差异可能会小到不重要。

    合并排序不是最快的排序,但是它有一些非常有益的副作用。也就是说,它可以对每一对文件并行实现,而且比不按顺序排序的排序快得多,它是内存消耗友好的,并且在两个文件合并结束时可以轻松地进行检查。这意味着您可以从中断的排序会话中恢复,而只会损失部分工作。