对包含超过 100,000,000 条记录的文本文件进行排序
Posted
技术标签:
【中文标题】对包含超过 100,000,000 条记录的文本文件进行排序【英文标题】:Sorting a text file with over 100,000,000 records 【发布时间】:2009-12-20 07:43:12 【问题描述】:我有一个需要按字母顺序排序的 5gig 文本文件 最好的算法是什么?
约束:
速度 - 尽可能快
内存 - 一台带有 1 Gig Ram 运行 windows XP 的电脑
【问题讨论】:
您的问题可能是重复的。查看外部合并排序:en.wikipedia.org/wiki/External_sorting 【参考方案1】:我经常使用sort
linux 命令对>2GB 的文本文件进行排序。通常需要 15 - 30 秒,具体取决于服务器负载。
去做吧,它不会像你想象的那么长。
更新由于您使用的是 Windows XP,您可以在UnxUtils 中获取排序命令。我使用的可能比 linux 版本多,而且它同样快。
大文件的瓶颈真的是磁盘速度.. 我上面的服务器有一个快速的 sata RAID。如果您的机器是台式机(或笔记本电脑),那么您的 7200 RPM(或 5400)RPM IDE 驱动器将增加几分钟的工作时间。
【讨论】:
但是,如果您不需要该功能,请非常小心避免将数据视为 UTF-8:在现代 Linux(和 cygwin)版本的 sort UTF-8 比较中,性能会降低大约100 次。【参考方案2】:对于文本文件,sort
,至少是 Linux 和其他系统中的 GNU Coreutils 版本,运行速度惊人。
看看--buffer-size
和相关选项,如果你的/tmp
目录太小,设置--temporary-directory
。
或者,如果您真的担心可能需要多长时间,您可以将文件分成更小的块,然后单独排序,然后将它们合并在一起(使用sort --merge
)。可以在不同的系统上并行对每个块进行排序。
【讨论】:
无论如何,任何名副其实的排序都会为您进行拆分、排序和合并。目标机器上只有 1 GB 的 RAM,一个 5 GB 的文件将使用最后合并在一起的多个中间文件进行排序。 确实如此。评论的重点是在多台机器上并行执行此操作的可能性。【参考方案3】:我会说取一小部分数据并尝试一些,看看哪个效果最好,然后继续。 This article might help you get started.
【讨论】:
【参考方案4】:排序的参数是什么?你有时间限制还是空间限制?文件有多接近有序?必须一次性完成吗?
【讨论】:
【参考方案5】:合并排序是您最好的选择。
【讨论】:
【参考方案6】:使用批量插入命令将数据导入 SQL Server 怎么样?
link text
这会将数据快速导入 SQL Server,然后允许您根据导入的数据执行各种高效的 SQL 排序。
您还可以使用 SQL Server SSIS 将其设置为自动任务。
【讨论】:
以上是关于对包含超过 100,000,000 条记录的文本文件进行排序的主要内容,如果未能解决你的问题,请参考以下文章
Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV