Python:集合库的Deque在处理大容量数据时需要花费时间和内存

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,

我已经使用核心Python API为我的ETL项目编写了一个文件到文件的验证。它有重复检查、计数检查、文件大小检查、逐行比较和将冲突记录到另一个输出文件中的方法。 我正在使用“collection”库对象:Counter和deque,而不是方法中的普通列表。它工作得很好。但对于大小为4000万及以上的文件,运行整个验证需要6到7分钟。当我调试了方法和主操作的性能后,我发现将文件内容转换为deque的代码行下面的代码需要3到4分钟

with open(sys.argv[1]) as source,open(sys.argv[2]) as target:
    src = deque(source.read().splitlines())
    tgt = deque(target.read().splitlines())
所以这里我需要做一些调整。我想得到以下几点的帮助

  • 将大文件的内容写入文件的有效方法是什么 收集对象
  • 如何降低内存利用率 处理大容量的收集对象
  • deque.clear()是否也会释放内存
  • 如果我创建了一个集合对象并存储了一些数据。然后我清除了它的内容,然后创建了另一个收集对象B并存储了一些数据。像这样,如果我在使用后继续清除集合对象,这是否有助于提高程序的性能
  • 在这里需要一些帮助

    您可以跳过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很大。如果不知道你在做什么,我们不可能给你具体的建议。。。