我有多个文本文件,表示我稍后需要解析的日志记录条目。每个文件的大小最多为1M,我有大约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());
答案 0 :(得分:2)
如果您不确定您的任务是否适合可用内存,最好在解析到数据库表后插入行并让数据库担心如何订购数据(时间戳列上的索引将有助于: - )
如果您确定内存没问题,我会在添加行时使用TreeMap
进行排序。
确保您的FileEntry类根据您的排序顺序实现hashCode()
,equals()
和Comparable
。
答案 1 :(得分:0)
在每个文件中,您可以假设条目是按时间排序的,因为“下一行”是在“上一行”之后写的。
这意味着您应该实现合并排序。最好合并两个最小的文件,然后重复,直到你有一个文件。
请注意,如果这些文件来自多台计算机,您仍然会无序地记录这些日志;因为,除非机器时钟通过某种可靠的方式同步,否则时钟会有所不同。即使它们是同步的,时钟也会不同;然而,它们可能差别不大,无关紧要。
合并排序不是最快的排序;然而,它有一些非常有益的副作用。也就是说,它可以为每对文件并行实现,并且它比不假设顺序的排序快得多,它对内存消耗很友好,并且您可以在两个文件合并结束时轻松检查点。这意味着您可以从中断的排序会话中恢复,同时只会失去部分工作。