2012-10-16 2 views
0

이전에 bitarray에 문제가 있었기 때문에에 0과 1의 길이의 문자열을 덤프하고 피클이 내 문제의 해결책이 될 수 있는지보고 싶습니다. . 그러나로드 한 후에 길이는 512132875입니다.cPickle을 사용하여 긴 문자열 저장 - 저장된 변수가 잘리지 않음

왜 그런가요? ...

나는 피클에서 어떤 제한이 있는지 수색,하지만 난 잘 알려진 이유가 있다면, 올바른 핵심 단어를 사용하지 않을 수 있습니다 ... 아무것도 발견하지 않았습니다

편집 :

당신은 당신이 선호하는 기술로 4807100171의 길이를 얻을 수 있도록 임의의 값의 캐릭터 b을 채울 수 있습니다 - 개인적으로 허프만 코딩을 사용하여 원본 데이터를 암호화 4807100171.에가는 간단한 for 루프 같은 아마 뭔가를하지만, 내가 여기 있다고 생각하는 긴 예가 될 것입니다. 그때 다음과 같이 문자열 b 덤프 :

b = "" 
for i in range(4807100171) 
    b += 0 

import cPickle as pickle 
pickle.dump(b, open("string.p", "wb"), pickle.HIGHEST_PROTOCOL) 
+0

일부 코드를 표시 할 수 있습니까? – jdi

+0

Bytearray를 사용하고 바이너리 모드 ('wb')로 파일에 쓸 수없는 이유는 무엇입니까? – jozzas

+0

pickle.dump를 사용하여 문자열이 잘리는 이유를 알고 있습니까? – macrocosme

답변

0

이 분명 정수 오버 플로우 문제 - 4,807,100,171 마이너스 ** 32 (2)는 불행하게도 512132875. 것을 알, 32 비트 정수는 바이너리 피클 형식이 나타내는 방법이다 문자열 길이. 텍스트 피클 형식 (프로토콜 버전 0)을 사용하면이 문제를 피할 수 있지만 텍스트 피클은 일반적으로 더 길며이 크기의 문자열을 처리하는 데는 불합리한 양의 메모리가 필요합니다. 나는 이것을 실제로 테스트하지는 않았다 - 그렇게하기 위해 내 컴퓨터에 충분한 메모리가 없다고 생각한다!

이 문자열이 저장되는 유일한 경우 문자열 자체를 파일에 쓰는 것이 훨씬 간단합니다.

+0

나는 이것이 긴 문자열이라는 것을 알고있다. 그래서 나는 먼저 bitarray를 시도했다. 실제로 이미 큰 파일을 압축하려고합니다. 비트 배열을 사용하는 길이 문제가있는 것 같습니다. 그러나, 당신이 지적한 것과 비슷한 문제 일 수 있습니다! 내 이전 게시물을 여기에서 확인할 수 있습니다 (아직 좋은 코드 예제로 업데이트 할 시간이 없었습니다) : http://stackoverflow.com/questions/12449741/bitarray-to01-doesnt-return-only-0s-and -1s-in-string-python – macrocosme

관련 문제