对包含超过 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 条记录的文本文件进行排序的主要内容,如果未能解决你的问题,请参考以下文章

优化超过 200,000 条记录的查询

Ruby-on-Rails 3.2:导出包含大型数据集(100,000 条记录)的 CSV

具有 150,000 条记录的数据库的服务器要求 [关闭]

将 100,000 条记录从 PL/SQL 程序输出到 XML 文件的最佳方法

需要从 Core Data 中读取 10,000 条记录

Laravel 无法显示超过 10,000 条的 mysql 记录