因此,出于某种奇怪的原因,我最终得到了一个 100GB 的未排序日志文件(实际上它是部分排序的),而我尝试应用的算法需要排序的数据。日志文件中的一行看起来像这样
data <date> data data more data
我可以在我的工作站上访问 C# 4.0 和大约 4 GB 的 RAM。我想某种类型的合并在这里是最好的,但我自己没有实现这些算法 - 我想问是否有某种捷径可以走。
顺便说一句,用 解析日期字符串DateTime.Parse()
非常慢并且占用大量 CPU 时间 - chugging速率仅为 10 MB/秒。有比以下更快的方法吗?
public static DateTime Parse(string data)
{
int year, month, day;
int.TryParse(data.Substring(0, 4), out year);
int.TryParse(data.Substring(5, 2), out month);
int.TryParse(data.Substring(8, 2), out day);
return new DateTime(year, month, day);
}
我写这个是为了加快速度DateTime.Parse()
,它实际上运行良好,但仍然需要大量的循环。
请注意,对于当前的日志文件,我也对小时、分钟和秒感兴趣。我知道我可以为 DateTime.Parse() 提供格式,但这似乎并没有加快速度。
我正在寻找正确方向的推动力,在此先感谢。
编辑:有些人建议我使用字符串比较来比较日期。这适用于排序阶段,但我确实需要解析算法的日期。我仍然不知道如何在 4GB 的可用内存上对 100GB 文件进行排序,而无需手动进行。
编辑 2 :好吧,感谢我使用windows sort的几个建议,我发现Linux 有一个类似的工具。基本上,您调用 sort ,它会为您解决所有问题。正如我们所说,它正在做某事,我希望它会尽快完成。我正在使用的命令是
sort -k 2b 2008.log > 2008.sorted.log
-k 指定我要在第二行排序,这是通常YYYY-MM-DD hh:mm:ss.msek
格式的日期时间字符串。我必须承认手册页没有解释所有选项,但我通过运行找到了很多示例info coreutils 'sort invocation'
。
我会报告结果和时间。这部分日志大约为 27GB。我正在考虑分别对 2009 和 2010 进行排序,然后使用 sort -m 选项将结果合并到一个文件中。
编辑 3好吧,检查iotop表明它正在读取数据文件的小块,然后疯狂地做一些事情来处理它们。这个过程似乎很慢。=(
sort
不使用任何内存,只使用一个核心。当它从驱动器读取数据时,它不会处理任何东西。难道我做错了什么?
编辑 4三个小时后,它仍然在做同样的事情。现在我正处于我想尝试使用函数参数的那个阶段,但我投入了三个小时......我将在大约 4 小时内中止,并尝试将其用于具有更智能内存的夜间计算和空间参数...
编辑 5在我回家之前,我使用以下命令重新启动了该过程:
sort -k 2b --buffer-size=60% -T ~/temp/ -T "/media/My Passport" 2010.log -o 2010.sorted.log
今天早上它返回了这个:
sort: write failed: /media/My Passport/sortQAUKdT: File too large
哇!我想我会添加尽可能多的硬盘来加快这个过程。显然,添加 USB 驱动器是有史以来最糟糕的主意。目前我什至无法判断它是否与 FAT/NTFS 或类似的有关,因为 fdisk 告诉我 USB 驱动器是一个“错误的设备”......不开玩笑。稍后我会尝试再试一次,现在让我们将这个项目放入可能失败的堆中。
最后通知 这一次它工作了,使用与上面相同的命令,但没有有问题的外部硬盘驱动器。谢谢大家的帮助!
基准测试
在同一个 SATA 控制器上使用 2 个工作站级(至少 70mb/sec 读/写 IO)硬盘,我花了 162 分钟来整理一个 30GB 的日志文件。今晚我需要对另一个 52 GB 文件进行排序,我会发布它是如何进行的。