我基本上想要相当于
... | sort -arg1 -arg2 -... | head -n $k
Run Code Online (Sandbox Code Playgroud)
但是,我的理解是排序将在整个输入上变为O(n log n).在我的情况下,我正在处理大量数据,因此运行时对我很重要 - 而且我还有一个习惯是使用排序临时文件溢出我的tmp /文件夹.
我宁愿让它用O(n log k)使用例如堆,这可能会更快,并且还将工作集内存减少到k.
是否有一些标准命令行工具的组合可以有效地执行此操作,而无需我自己编写代码?理想情况下,它将支持sort命令的完全表达排序功能.sort(至少在ubuntu上)似乎没有man-page记录的开关来将它拉下来......
UNIX/Linux 提供了通才工具集。对于大型数据集,它会执行大量 I/O。它会做你想做的一切,但速度很慢。如果我们了解输入数据,那将会有很大帮助。
IMO,你有一些选择,但没有一个是你真正喜欢的。
进行多部分“基数”预排序 - 例如,让 awk 将所有键以 'A' 开头的行写入一个文件,将 'B' 写入另一个文件,等等。或者如果您只写入 'P' 'D' 和 'Q ',让 awk 吸出你想要的东西。然后对一个小子集进行完整排序。这将创建 26 个名为 A、B ...Z 的文件
awk '{print $0 > substr($0,1,1)} 大文件;排序 [此处的选项] PDQ > 结果
花费 $$:(示例)从iri.com 任何其他排序软件购买 CoSort。这些类型使用各种优化,但它们不像 bash 那样免费。您还可以购买 SSD,它可以将磁盘排序速度提高几个数量级。5000iops现在到75000iops. 使用该TMPDIR变量将您的 tmp 文件放在 SSD 上,仅读取和写入 SSD。但请使用现有的 UNIX 工具集。
使用一些软件,如R或strata,或者最好是数据库;所有这些都是针对大型数据集的。
做你现在正在做的事情,但是在 UNIX 排序运行时观看 youtube。
IMO,当您想要快速获得结果时,您对大型数据集使用了错误的工具。
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |