2011-11-23 5 views
6

어딘가에서 데이터의 버퍼를 bytearray으로 읽습니다. 지금, 나는 스트림 같은 인터페이스를 사용하여이 데이터를 작업 할 (즉 read, seek 등)Python 3 - bytearray에 비 복사 스트림 인터페이스가 있습니까?

난 그냥 내 bytearrayio.BytesIO로 포장 할 수 있습니까?

mybytearray = bytearray(...) 
stream = io.BytesIO(mybytearray) 

나의 두려움은 여기 mybytearrayBytesIO 데이터를 복사,하지만 난 그것을 원하지 않아요 - 버퍼가 매우 큰 때문이다. 복사본이 필요 없으며 스트림이 원본 데이터에서 작동하도록하고 수정할 수도 있습니다. 무엇을 할 수 있습니까?

답변

8

BytesIO은 자체 메모리를 관리하며 초기화에 사용되는 버퍼를 복사합니다. bytearray을 파일과 같은 클래스로 캡슐화 할 수 있습니다. 또는 다른 방법으로 이동하여 BytesIO 개체가 메모리 할당을 처리하도록 할 수 있습니다. 그럼 당신은 인덱스와 조각에 의해 수정 될 수있는 버퍼의 뷰를 얻을 수 있습니다,하지만 당신은 다시 크기 수없는 버퍼를 뷰가 존재하는 동안 :

>>> f = io.BytesIO(b'abc') 
>>> view = f.getbuffer() 

>>> view[:] = b'def' 
>>> f.getvalue() 
b'def' 

>>> view[3] = b'g' 
IndexError: index out of bounds 

>>> f.seek(0, 2) 
>>> f.write(b'g') 
BufferError: Existing exports of data: object cannot be re-sized 

>>> del view 
>>> f.write(b'g') 
>>> f.getvalue() 
b'defg' 

편집 :

참조 issue 22003, BytesIO copy-on-write. 최신 패치 (cow6)는 bytes에 대해서만 기록시 복사를 지원합니다.

관련 문제