【问题标题】:Python MemoryError on struct.unpackstruct.unpack 上的 Python MemoryError
【发布时间】:2016-11-20 17:10:40
【问题描述】:

我在尝试解压缩从文件中读取的数据时收到MemoryError。我希望能够读取每一个字节,这就是我打开它的原因。当我只解压缩 1 个字节时它可以工作,但是当我想读取整个转储 (total_size) 时,它会给出错误。我不知道该怎么办。

def read_memory(self, mem_file, address, byte_count):
        mem_file.seek(address)
        data = mem_file.read(byte_count)
        return data

memory_dump = self.read_memory(mem_file, start_addr, total_size)
unpacked = struct.unpack("{}B".format(total_size), memory_dump) # MemoryError

我该如何解决这个问题?

【问题讨论】:

  • 你为什么要解压data?如果data 是一个字节串(可能),那么它已经是一个字节序列。以后怎么用unpacked?如果您需要一个看起来像是读取整个文件的对象,您可以尝试mmap(即使文件不适合内存,只要它适合地址空间)。
  • @J.F.Sebastian 我想将每个字节与字节数组中的元素进行比较。但是例如 memory_dump[0] 是 '\x7f' 我不能将它与一个字节进行比较。我该怎么做?
  • 好的,我使用 hexlify 修复了它。感谢您的建议!
  • 您可以根据具体情况使用mmaparray.array.fromfilebytearray(bytestring) 或反向使用bytes(some_bytearray)。可能有几种有效的方法(在 Python 2 上索引 str 返回单个长度 str,在 Python 3 上返回 int)。 hexlify() 返回字节的 text 表示不是它。这可能是一个有趣的单独问题:您在比较二进制文件吗?它们有多大?是否存在大于字节的内部结构?是否需要一次读取整个文件?

标签: python memory unpack


【解决方案1】:

好像我没有足够的内存

【讨论】:

  • 我也有同样的问题。我需要读取 128MB 的二进制数据,其中一个像素以 16 位表示。然后,我转换为 float64 numpy 数组。根据我的计算,我只需要 524MB 的 RAM。我的电脑有 8GB RAM(大约 4GB RAM 可用)。我不知道发生了什么,也许我在阅读 numpy 时遇到了问题,或者我需要在图像中读取为切片......
猜你喜欢
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多