现在,我正在使用字符串、StringIO 或 cStringIO 缓冲字节。但是,我经常需要从缓冲区的左侧删除字节。天真的方法会重建整个缓冲区。如果左截断是一种非常常见的操作,是否有最佳方法来执行此操作? Python 的垃圾收集器实际上应该对截断的字节进行 GC。
任何类型的算法(将缓冲区分成小块?)或现有的实现都会真正有帮助。
编辑:
我尝试为此使用 Python 2.7 的内存 View ,但遗憾的是,当原始引用被删除时,“ View ”之外的数据没有被 GC 处理:
# (This will use ~2GB of memory, not 50MB)
memoryview # Requires Python 2.7+
smalls = []
for i in xrange(10):
big = memoryview('z'*(200*1000*1000))
small = big[195*1000*1000:]
del big
smalls.append(small)
print '.',
请您参考如下方法:
A deque如果左侧移除操作频繁,将会很有效(与使用列表、字符串或缓冲区不同,它的两端移除均摊为 O(1))。然而,它在内存方面比字符串更昂贵,因为您会将每个字符存储为它自己的字符串对象,而不是打包序列。
或者,您可以创建自己的实现(例如,固定大小的字符串/缓冲区对象的链表),它可以更紧凑地存储数据。
