【问题标题】:The fastest way to read binary files by bytes in PythonPython中按字节读取二进制文件的最快方法
【发布时间】:2015-10-30 08:46:40
【问题描述】:

我正在制作一个程序,它应该能够使用霍夫曼算法对任何类型的文件进行编码。一切正常,但是在大文件上使用它太慢了(至少我认为是这样)。当我试图打开一个 120MB 的 mp4 文件来解压它时,我花了大约 210 秒来读取文件。更不用说这样做需要大量的内存。我认为使用 struct 解包会很有效,但事实并非如此。在python中没有更有效的方法吗?我需要按字节读取任何文件,然后将其传递给字符串中的霍夫曼方法。

if __name__ == "__main__":
    start = time.time()
    with open('D:\mov.mp4', 'rb') as f:
        dataL = f.read()
    data = np.zeros(len(dataL), 'uint8')

    for i in range(0, len(dataL)):
        data[i] = struct.unpack('B', dataL[i])[0]

    data.tostring()

    end = time.time()
    print("Original file read: ")
    print end - start

    encoded, table = huffman_encode(data)

【问题讨论】:

  • 你试过用pypy吗?
  • 这很奇怪。在我的电脑上读取一个 3GB 的文件用了不到一分钟的时间。您的 D 驱动器不是可移动驱动器还是网络驱动器? (这可以解释缓慢),还是极度分散?
  • 使用完全相同的代码?当我回到家时,我可以在我的主桌面上尝试它,但我仍然需要它才能在我的笔记本电脑上工作。顺便说一句,笔记本电脑有 i5 2410M、5400rpm 硬盘和 8GB RAM。 D 只是常规分区。而且我的系统新安装了w10。我不认为应该有这么小的差异。当我运行它时,它只使用了我 30% 的 CPU,但我认为 4GB 的 RAM 并不是最佳的。而且我还没有尝试过pypy。我宁愿坚持使用常规的 python。
  • 是的,使用简单的f.read()。我的系统性能更高一些。我看到瓶颈是硬盘驱动器(对于您的读取操作)。没有/不应该有太多的 CPU 工作。我还有 4+ GB 的可用 RAM,因此在加载文件时,它的内容应该保存在内存中,而不是缓存在交换文件中,这会使其变慢。

标签: python file binaryfiles


【解决方案1】:

您的方法是将文件加载到 python 对象中 -> 创建一个空的 Numpy 数组,然后使用 Python 迭代器一点一点地填充 Numpy 数组。

让我们去掉中间商:

if __name__ == "__main__":
    start = time.time()
    data = np.fromfile('d:\mov.mp4', dtype=np.uint8, count=-1)
    end = time.time()
    print("Original file read: ")
    print end - start
    encoded, table = huffman_encode(data)

如何处理“数据”取决于您的 huffman_encode(data) 将接收的数据类型。我会尽量避免使用字符串。

关于通话的文档在这里:http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html

  • 我很想听听 cmets 的速度差异 :)

【讨论】:

  • 感谢您的建议。相同的 120MB 文件现在花了我 72 秒(之前的 210 是在我使用笔记本电脑时,所以它需要更长的时间)现在花了 0.0629 秒!内存消耗从 4GB 下降到 200MB :) 所以现在速度非常快。现在我只想弄清楚为什么编码本身需要这么多
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 2012-05-01
  • 2017-10-25
  • 2013-04-07
  • 1970-01-01
  • 2019-10-02
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多