2013-07-06 3 views
0

내가 그렇게하면 StringIO간에 메모리가 공유됩니까? 나는 파이썬 프로세스의 메모리 라인에 증가하지 않았다 때문입니다 느낌이있다 6. 그러나python : 메모리가 StringIO간에 공유 되었습니까?

In [1]: from StringIO import StringIO 
In [2]: s = StringIO() 
In [3]: s.write('abcd'*10000000) # memory increases 
In [4]: s.tell() 
Out[4]: 40000000 
In [5]: s.seek(0) 
In [6]: a = StringIO(s.read()) # memory DOES NOT increase 
In [7]: a.tell() 
Out[7]: 0 
In [8]: a.read(10) 
Out[8]: 'abcdabcdab' 

내 문제는 내가 그 두 변수를 삭제하면, 파이썬 프로세스의 메모리 소비가 더 이상 감소하지 않는다는 것입니다 ... 왜 ? 이 코드가 메모리 누수를 생성합니까?

방금 ​​변수 하나를 사용했을 때 변수를 삭제하면 메모리가 해제됩니다.

나는 여기에서 무슨 일이 벌어지고 있는지 더 잘 이해하고 싶다. 감사합니다. .

답변

3

StringIO() 개체가 이 아니고 문자열이 전달됩니다. 문자열을 변경할 수 없으므로 필요가 없습니다.

청크로 된 StringIO() 개체의 데이터를 읽을 때 원래 입력 문자열의 하위 문자열 인 새 문자열 개체가 만들어집니다.

개체를 해제 할 때 메모리 사용량이 즉시 감소하지 않습니다. 메모리 할당은 OS에 의해서만 필요에 따라 재분배되며 많은 종류의 (작은) 객체는 효율성을 위해 파이썬에 의해 인턴되기도하고 절대로 해제되지 않고 재사용되기도합니다.

+0

좋아요. 청크로 개체를 읽으면 새로운 문자열 개체가 생성된다는 것을 이해합니다. 괜찮아. 나는 새로운 StringIO를 만들 때마다 원래의 데이터 문자열이 복제되지 않도록하고 싶다. 원시 데이터를 복제하지 않고 한 명의 작가와 여러 독자를 갖기 위해 노력하고 있습니다. – Michael

+0

@YAmikep : 독자가 문자열을 복제하지 않습니다. –

+0

이 방법은 StringIO에서 작동하지만 cStringIO와는 다른 것으로 보입니다. cStringIO를 사용하면 매번 문자열이 증가하기 때문에 문자열을 메모리에 복제하는 것처럼 보입니다. reader = StringIO(); reader.write (source.getvalue()) 흥미 롭습니다. – Michael

관련 문제