Python:集合库的Deque在处理大容量数据时需要花费时间和内存
我已经使用核心Python API为我的ETL项目编写了一个文件到文件的验证。它有重复检查、计数检查、文件大小检查、逐行比较和将冲突记录到另一个输出文件中的方法。 我正在使用“collection”库对象:Counter和deque,而不是方法中的普通列表。它工作得很好。但对于大小为4000万及以上的文件,运行整个验证需要6到7分钟。当我调试了方法和主操作的性能后,我发现将文件内容转换为deque的代码行下面的代码需要3到4分钟Python:集合库的Deque在处理大容量数据时需要花费时间和内存,python,python-2.7,python-2.x,Python,Python 2.7,Python 2.x,我已经使用核心Python API为我的ETL项目编写了一个文件到文件的验证。它有重复检查、计数检查、文件大小检查、逐行比较和将冲突记录到另一个输出文件中的方法。 我正在使用“collection”库对象:Counter和deque,而不是方法中的普通列表。它工作得很好。但对于大小为4000万及以上的文件,运行整个验证需要6到7分钟。当我调试了方法和主操作的性能后,我发现将文件内容转换为deque的代码行下面的代码需要3到4分钟 with open(sys.argv[1]) as source,
with open(sys.argv[1]) as source,open(sys.argv[2]) as target:
src = deque(source.read().splitlines())
tgt = deque(target.read().splitlines())
所以这里我需要做一些调整。我想得到以下几点的帮助
with open(sys.argv[1]) as source,open(sys.argv[2]) as target:
src = deque(source)
tgt = deque(target)
通常,deque占用的空间很小,只是deque引用的所有字符串占用空间的一小部分(在64位构建中,deque中的指针占用8字节,而即使是小字符串也至少占用50字节)
如果内存仍然很紧,请考虑对字符串进行交互,以消除由重复字符串引起的多余空间:
from sys import intern
with open(sys.argv[1]) as source,open(sys.argv[2]) as target:
src = deque(map(intern, source))
tgt = deque(map(intern, target))
关于运行时间,通常CPU速度比磁盘访问时间快得多,因此程序可能受到I/O限制。在这种情况下,除了移动到更快的输入源之外,您无法提高速度。在您的代码中,您正在将整个查找读取到内存中,然后创建其行的
列表,最后创建deque
。要以更有效的方式创建包含文件行的deque,您只需执行src=seque(source)
,因为文件是可编辑的,它们已经生成了行。然而,这只会减少临时RAM的使用。拥有4000万个元素的deque很大。如果不知道你在做什么,我们不可能给你具体的建议。。。