【问题标题】:Loading 15GB file in Python在 Python 中加载 15GB 文件
【发布时间】:2013-01-10 10:55:07
【问题描述】:

我有一个包含 25000 行的 15GB 文本文件。 我在 Python 中创建了一个多级字典,其形式为: dict1 = {'':int}, dict2 = {'':dict1}。

我必须在我的程序中多次使用整个 dict2(大约 1000 次……在一个 for 循环中)。 谁能告诉一个好的方法来做到这一点。

文件中存储了相同类型的信息 (25000 张图像的不同 RGB 值的计数。每行 1 张图像) 例如:文件的 1 行如下: 图片1:255,255,255-70; 234,221,231-40; 112,13,19-28; 图片2:5,25,25-30; 34,15,61-20; 102,103,109-228; 等等。

【问题讨论】:

  • 在实践中它肯定会消耗至少 15GB 的 RAM(并且可能是 2 或 4 倍)。你有至少 16GB 的空间吗?
  • 这将有助于更多地了解如何使用这些数据。您真的需要在应用程序的每个点对整个数据结构进行任意随机访问吗?也许您一次只需要一张图像的数据,或者一次只需要一种颜色的数据?
  • 以下任一答案有帮助吗?

标签: python file dictionary loading


【解决方案1】:

最好的方法是使用分块。

def read_in_chunks(file_object, chunk_size=1024):
    """Lazy function (generator) to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data

f = open('really_big_file.dat')
for piece in read_in_chunks(f):
    process_data(piece)

当您开始处理大文件时,使用 map-reduce 习惯用法可能会有所帮助,因为您将能够独立处理单独的分块文件,而无需将完整的数据集拉入内存。

【讨论】:

    【解决方案2】:

    在python中,如果你使用一个文件对象作为迭代器,你可以逐行读取一个文件,而不用在内存中打开整个文件。

    for line in open("huge_file.txt"):
        do_something_with(line)
    

    【讨论】:

    • 抱歉,评论不完整。我正在这样做。 handle = open("large_file") for line in handle: (key,a) = line.split(':') tempdic = a.split(';') for line2 in tempdic: (k,v) = line2. split('-') dict1[k] = v dict2[key] = dict1 请参阅文件中数据格式的原始问题。再次感谢
    • @user2013985 你可以使用file.seek(0) 方法转到文件的开头。
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2016-10-26
    • 1970-01-01
    • 2023-03-06
    • 2020-11-17
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多