如何在python中处理大数据流?

时间:2014-01-23 02:08:21

标签: python

Python noob,强大的c背景。

我正在编写一个简单的服务器,它从套接字中读取大小为1024字节的块。我需要将块连接成一个大文件(它是一个视频)。对于初学者我尝试了类似的东西

movie = bytearray()
while numblocksrxd != numBlocks:
    data=conn.recv(1024)
    numblocksrxd+=1
    movie = movie+data

我很快意识到这个代码每次分配给它时都会创建一个movie的新实例,这会随着它的增长而产生越来越大的mem副本(我认为)。如果我在C中这样做,我只需要将我需要的空间进行malloc并将其填入。我如何在python中处理这个?

2 个答案:

答案 0 :(得分:4)

movie += data

如果目标是可变的,则通常在不创建新对象的情况下完成增强分配。在这种情况下,bytearray支持就地+=,因此此代码不会创建新对象。当bytearray的内部缓冲区空间不足时,它将分配一个新的,但分配采用摊销的常量时间,管理缓冲区的movie对象不会被替换。

答案 1 :(得分:1)

我怀疑你真的需要更多的效率,而不仅仅是追加像这样的字节串。是的,它将重新分配数组并复制它,但它使用通常的指数扩展技巧,因此摊销时间仍然是恒定的。

如果你真的需要更高的效率(我怀疑你这样做,但是......),你可以只存储一个list字节字符串而不是一个大字节字符串。如果你可以按原样使用,那很好。如果没有,您可以在最后使用join将它们连接起来。这几乎总是在Python中构建大字符串的最快方法。所以:

movie = []
while numblocksrxd != numBlocks:
    data=conn.recv(1024)
    numblocksrxd+=1
    movie.append(data)
movie = b''.join(movie)

或者你可以使用你在C中使用的相同技巧:

movie = bytearray(numBlocks * 1024)
while numblocksrxd != numBlocks:
    data=conn.recv(1024)
    numblocksrxd+=1
    movie[numblocksrxd*1024:(numblocksrxd+1)*1024] = data