Python:如何将巨大的文本文件读取到内存中

Python:如何将巨大的文本文件读取到内存中,第1张

Python:如何将巨大的文本文件读取到内存中

此页面上有一个用于对大于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
上进行排序,顺便说一句,我用它作为唯一的排序方法列 一起使用
,而不是默认值,后者将对它们进行独立排序(完全弄乱了您的数据)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5644208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存