지금은 문자열, StringIO 또는 cStringIO를 사용하여 바이트를 버퍼링하고 있습니다. 하지만 버퍼의 왼쪽에서 바이트를 제거해야하는 경우가 자주 있습니다. 순진적인 접근 방식은 전체 버퍼를 다시 작성합니다. 왼쪽 잘림이 매우 일반적인 작업 인 경우이를 수행하는 최적의 방법이 있습니까? 파이썬의 가비지 컬렉터는 실제로 잘라 버린 바이트를 GC해야합니다.왼쪽에서자를 수있는 파이썬 버퍼?
어떤 종류의 알고리즘 (작은 조각으로 버퍼를 유지 하시겠습니까?) 또는 기존 구현이 실제로 도움이됩니다.
편집 :
나는이 파이썬 2.7의 memoryview을 사용하려고하지만, 슬프게도, "보기"외부 데이터 원본 참조가 삭제 될 때 GCed되지 않습니다 :
# (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 '.',
왜 바이트를 제거 하시겠습니까? 완료 할 때 버퍼를 사용하지 않고 전체 버퍼를 버리는 것은 어떨까요? –
(임의의 구분 기호로 구분 된) 전체 행이 버퍼에서 점진적으로 추출되어 콜백으로 전송됩니다. 버퍼를 주변에두면 메모리가 소모 될 수 있습니다. – ivank
"메모리를 소모 할 수 있습니까?" 정말? 이 증거가 있습니까? 실제로 메모리를 소진했다는 증거가있을 때까지 이와 같은 것을 과도하게 최적화하는 것이 거의 도움이되지 않습니다. –