2010-07-28 57 views
-1

我有多个文本文件,代表日志条目,我需要稍后解析。每个文件的大小高达1M,我有大约10个文件。 的每一行都具有以下格式:根据时间戳排序+合并多个文件的行

Timestamp\tData 

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

什么是最聪明的方法?我Pseudo'd代码如下所示:

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

如果您不知道,您的任务将适合可用内存,你最好解析成一个数据库表后插入你的线条,并有关于如何数据库忧要订购数据(时间戳列上的索引将有助于:-)

如果您确定内存没有问题,那么我会使用TreeMap进行排序,同时向它添加行。

确保您的FileEntry类根据您的排序顺序执行hashCode()equals()Comparable

+1

yup,对于每个1MB的10个文件,树图应该足够多。实际上,TreeSet,因为不需要地图功能,是吗? – 2010-07-28 09:24:28

+0

如果你不需要查找访问'TreeSet'会很好,是的。 – rsp 2010-07-28 09:47:11

+0

我使用了TreeSet方法,它工作正常。小型基准测试显示,Collections.sort()和TreeSet(分别为151ms和170ms)(每种方法10次尝试的平均值)与150k测试数据(包括文件打开+阅读) – f1sh 2010-07-28 10:05:42

0

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

这意味着你应该实现合并排序。最好合并排序两个最小的文件到对方,然后重复,直到你有一个文件。

请注意,如果这些文件来自多台机器,您仍然将无序登录;因为除非机器时钟通过一些可靠的手段同步,否则时钟将有所不同。即使它们同步,时钟也会有所不同;然而,他们可能会有所不同,但数量可能并不重要。

合并排序不是最快的排序;然而,它有一些非常有益的副作用。也就是说,它可以针对每对文件并行执行,并且它比不假定顺序的排序快得多,它对内存消耗很友好,并且可以在两个文件合并的末尾轻松检查点。这意味着您可以从中断的排序会话中恢复,但只会失去部分工作量。

相关问题