2015-10-30 38 views
0

我正在制作一个程序,该程序应该能够使用huffman算法对任何类型的文件进行编码。这一切都有效,但在大文件上使用它太慢了(至少我认为是这样)。当我试图打开一个120MB的mp4文件来解压缩它时,我花了大约210s来阅读文件。更不用说,它花了大量的内存来做到这一点。我认为使用结构解包会很高效,但它不是。 python中没有更好的方法吗?我需要按字节读取任何文件,然后将其传递给字符串中的huffman方法。在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) 
+0

您是否尝试过使用pypy速度的差异? – alazaro

+0

这很奇怪。在我的电脑上阅读3GB文件花了不到一分钟的时间。不是您的_D_驱动器可移动或网络? (这可以解释缓慢),还是极其分散? – CristiFati

+0

使用完全相同的代码?我可以在我的主桌面上回家时尝试它,但我仍然需要它在我的笔记本电脑上工作。顺便说一句,笔记本电脑有i5 2410M,5400转硬盘和8GB内存。 D只是普通的分区。而我的系统已经新安装了w10。但我认为不应该有这样的边际差异。当我运行它时,它只使用我的CPU的30%,但我认为这不是最佳的4GB RAM。 而我没有尝试pypy。我宁愿坚持常规的Python。 – Arcane

回答

2

你的做法是把文件加载到一个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(数据)将获得的数据。我会尽量避免使用字符串。在电话会议上

文档是在这里:http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html

  • 我很想听到的意见:)
+0

谢谢你的建议。同样的120MB文件现在花了我72s(之前的210是当我使用笔记本时,所以它有一个更长的时间)现在花了0.0629s!内存消耗从4GB降至200MB :)所以现在这个速度非常快。现在我只是要弄清楚为什么编码本身需要这么多 – Arcane

相关问题