【发布时间】:2020-04-11 17:48:06
【问题描述】:
使用 zlib,我希望能够压缩 numpy 数组并将它们写入文件,然后能够将它们读回。我做了以下
with open(outputFile, 'wb') as zFile:
for row in array:
compressed = zlib.compress(row, compressionLevel)
zFile.write(compressed)
with open(os.path.join(path, fileName), 'rb') as zFile:
for line in zFile:
decompressed = zlib.decompress(line)
data.append(decompressed)
data = np.array(data)
写入过程在填充文件时起作用,如果我使用compressionLevel = 0 写入更简单的数据,就可以了。但我无法使阅读过程正常工作。我尝试对zlib.compress(row.tobytes() + '\n'.encode(), compressionLevel) 执行操作,以便可以读取正确的行,但我的数据中的某些元素似乎被解释为\n,因此它不会读取真正的行。
我还尝试在 while 循环中读取执行 zFile.read(bufferSize) 的文件,并在没有更多内容可读取时中断循环,但之前压缩的每个元素都有不同的大小(由于每一行的性能不同)所以我无法提前知道缓冲区大小。
编辑: 关于答案,似乎 np.savez_compress 更适合,但现在,我坚持使用 zlib,因为它可以在项目的其他地方使用,我不能自己更改它现在。
【问题讨论】:
-
@snakecharmerb 非常感谢。这比我尝试的要好得多。它实际上对我有用。但是我仍然遇到问题,因为当流很大时,这个解决方案似乎很慢。我用于测试的文件大约是 10Mo,但真正的文件可能大约是 500Mo,但我需要大约 25 秒来解压缩我的测试文件。这就是我尝试逐行读取文件的部分原因,这样我就不必每次都处理整个剩余的未解压缩部分。
-
关于 decompressobj,我认为它不会输出任何内容,除非它具有完整的真实行(知道标题的长度),以便我可以循环“假”行并将它们提供给 compressobj .但这不是我所拥有的行为,因为它可以随时输出一些东西,而没有完整的真实线路。
-
就速度而言,AFAICT
zlib只是用 C 语言编写的围绕系统 zlib 库的包装器 - 在 stdlib 中甚至没有zlib.py。所以我不确定如何在不使用较少压缩的情况下加速它。
标签: python python-3.x zlib