此页面上有一个用于对大于RAM的文件进行排序的方法,尽管您必须针对涉及CSV格式数据的情况进行调整。那里也有指向其他资源的链接。
编辑: 确实,磁盘上的文件不是“大于RAM”,但是内存中的表示形式很容易变得比 可用RAM
大得多。一方面,您自己的程序无法获得全部1GB( *** 作系统开销等)。另外,即使您以最紧凑的形式将其存储为纯Python(两个整数列表,假设使用32位计算机等),对于这30M对整数,您仍将使用934MB。
使用numpy,您也可以完成这项工作,仅使用约250MB。以这种方式加载并不是特别快,因为您必须计算行数并预分配数组,但是考虑到它在内存中,它可能是最快的实际排序:
import timeimport numpy as npimport csvstart = time.time()def elapsed(): return time.time() - start# count data rows, to preallocate arrayf = open('links.csv', 'rb')def count(f): while 1: block = f.read(65536) if not block: break yield block.count(',')linecount = sum(count(f))print 'n%.3fs: file has %s rows' % (elapsed(), linecount)# pre-allocate array and load data into arraym = np.zeros(linecount, dtype=[('a', np.uint32), ('b', np.uint32)])f.seek(0)f = csv.reader(open('links.csv', 'rb'))for i, row in enumerate(f): m[i] = int(row[0]), int(row[1])print '%.3fs: loaded' % elapsed()# sort in-placem.sort(order='b')print '%.3fs: sorted' % elapsed()
在我的机器上输出的示例文件类似于您显示的内容:
6.139s: file has 33253213 lines238.130s: read into memory517.669s: sorted
numpy中的默认值为Quicksort。ndarray.sort()例程(就地排序)也可以采用关键字参数
kind="mergesort",
kind="heapsort"但是似乎这两个方法均不能在Record
Array上进行排序,顺便说一句,我用它作为唯一的排序方法列 一起使用
,而不是默认值,后者将对它们进行独立排序(完全弄乱了您的数据)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)