![]() |
1
22
有一种方法可以对大于RAM的文件进行排序 on this page ,但您必须根据涉及CSV格式数据的案例对其进行调整。这里还有指向其他资源的链接。 的确,磁盘上的文件并不“比RAM大”,但内存中的表示形式很容易变得比RAM大得多 . 首先,您自己的程序不会获得整个1GB(操作系统开销等)。另一方面,即使您将其存储为纯Python的最紧凑形式(两个整数列表,假设为32位机器等),对于这3000万对整数,您也将使用934MB。 使用numpy,您也可以完成这项工作,只需要大约250MB。以这种方式加载并不特别快,因为您必须计算行数并预分配阵列,但考虑到它在内存中,它可能是最快的实际排序:
在我的机器上输出的示例文件与您显示的类似:
numpy中的默认值是
Quicksort
. ndarray.sort()例程(用于就地排序)也可以接受关键字参数
|
![]() |
2
8
所有python对象在实际存储的数据之上都有内存开销。根据我的32位Ubuntu系统上的getsizeof,元组的开销为32字节,int的开销为12字节,因此文件中的每一行都需要56字节+列表中的4字节指针——我认为对于64位系统来说,这会多得多。这与您给出的数字一致,意味着您的3000万行将占用1.8GB。 我建议不要使用python,而是使用unix排序实用程序。我不是Mac电脑的负责人,但我认为OS X排序选项与linux版本相同,因此这应该可以工作:
-k2表示第二个字段上的排序 这将对文件进行排序,并将结果写入标准输出。您可以将其重定向到另一个文件,或者将其通过管道传送到python程序进行进一步处理。 如果不想在运行python脚本之前对文件进行排序,可以使用子流程模块创建一个到shell sort实用程序的管道,然后从管道输出中读取排序结果。 |
![]() |
4
4
以下是如何进行排序并按排序顺序写入输出文件:
不幸的是
旁白:以你的工资率计算,额外的GB或3 GB内存(以小时为单位)的成本是多少? |
![]() |
5
2
您可能想看看mmap: http://docs.python.org/library/mmap.html 它将让你像对待一个大数组/字符串一样对待文件,并让操作系统处理数据进出内存的问题,以使其适合。 因此,您可以读取csv文件,每次读取一行,然后将结果写入mmap'd文件(以合适的二进制格式),然后处理mmap'd文件。由于mmap文件只是临时文件,因此您当然可以为此创建一个tmp文件。
不过有点粗糙。实际上,您可能希望用一个好的类来结束所有这些,这样您的edge就可以以一种使其行为类似于列表的方式进行访问(带有索引、len等)。希望它能给你一个起点。 |
![]() |
6
0
我使用 external merge sort : https://bitbucket.org/richardpenman/csvsort
|
![]() |
Cute dog · 如何将文本与重新排序的图像相匹配? 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
![]() |
Rohan Mittal · 按dict值对dict排序 2 年前 |
![]() |
Pikachu620 · 可以对事件列表进行排序吗? 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |
![]() |
tryingmybest09 · 设置出生日期排序不正确 2 年前 |