【问题标题】:Creating Really Big Python lists创建非常大的 Python 列表
【发布时间】:2015-08-18 14:54:00
【问题描述】:

我正在尝试创建与 cPickle 兼容的图像数据库。最初列表是空的。目录中每个图像的数据作为新行添加到列表中。图像为 224x224。图像大小平均为 8KB。加载大约 10000 张图像后,我的电脑挂了。没有鼠标移动。什么都没发生。需要重启。下面是执行此操作的代码 sn-p..

cr=csv.reader(open(csv_file,"rb"))
    for row in cr:
        print row[0], row[1]
        try: 
            image=Image.open(row[0]+'.jpg').convert('LA')
            pixels=[]
            pixels=[f[0] for f in list(image.getdata())]
            #pix=np.array(image)
            dataset.append(pixels)
            #dataset.append(pix)
            labels.append(row[1]) 
            del image

        except: 
            print("image not found")

我尝试将图像尺寸减小到 28X28,它可以工作。但我不想减小图像的大小。我正在使用 python 64 位可执行文件。内存为 4GB。 Ubuntu 14.04。我怀疑这是由于堆栈空间有限而发生的,并且列表占用的堆栈空间超过了可用的堆栈空间。如果是这样,我如何创建这个巨大的列表?这个问题有什么解决方法吗?我的最终目标是创建一个以像素数据为行的 numpy 数组。目前我正在将列表转换为 numpy 数组。这个问题有解决方案吗??

【问题讨论】:

  • 您能否创建一个生成器,为每个图像生成标签和像素的元组。这样您就不必一次真正在内存中创建所有数据?
  • 我无法复制您的问题,因为我没有安装 PIL。但我认为问题在于 JPG 是一种压缩格式,而您正在尝试存储未压缩的格式,这将比每张图像 8K 大得多。
  • 我不喜欢像我这样的答案,但总的来说,您应该避免将所有内容都保存在内存中。循环使用生成器/打开和关闭文件,而不是一次全部使用
  • 您总是可以放弃构建自己的数据库格式并使用标准库中的搁置...docs.python.org/2/library/shelve.html
  • @maxymoo 你是说使用其他格式不会导致这个问题吗?我尝试只加载这些图像,而不将数据附加到列表中。它没有崩溃。我怀疑这是列表的问题

标签: python arrays list numpy crash


【解决方案1】:

如果数据最终是 numpy 数组,可以尝试使用numpy.memmap。它就像“普通”的 numpy 数组一样工作,不同之处在于数据实际上是以二进制形式存储在磁盘上的。只有请求的数组块被放入 RAM,因此可能会解决您的问题。

如果确定了数据数组的大小,则只需要在创建memmap对象时设置正确的维度即可。如果没有,请查看 numpy.memmap.resize,无论如何你应该都能创建它。

哦,还有其他解决方案,例如PyTables
祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多