2014-01-05 3 views
4

최근에 한 학생이 큰 문자열 (2 ~ 4MB)을 사전에 사용하여 독립적 인 프로젝트를 수행하고 있음을 발견했습니다.Python에서 많은 양의 텍스트를 저장하는 가장 좋은 방법은 무엇입니까?

큰 텍스트 블록으로 작업 할 이유가 없었으며 그러한 큰 문자열을 만드는 것과 관련된 성능 문제가 있는지 궁금해졌습니다.

단순히 문자열을 만드는 것보다 더 나은 방법이 있습니까? 이 질문은 주로 상황에 따라 다르다는 것을 알지만, 가능한 유스 케이스를 여러 개 커버 할 수있는 일반화 된 답변을 찾고 있습니다.

많은 텍스트로 작업하는 경우 어떻게 코드에 저장하겠습니까? 일반 문자로만 이루어진 몇 가지 문자로 작업하는 것과는 다른 방식으로 작업 하시겠습니까?

+0

문자열/dict 값은 무엇입니까? 그들은 수색 했습니까? 그들 중 무리가 있습니까? – dawg

+0

그들은 수색 될지도 모르고, 그들 중 다수가 있을지도 모른다. 나는 일반적으로 이야기하고 있습니다. 만약 당신이 그 질문들에 근거하여 다르게 선택한다면, 당신의 대답에서 그렇게 말하십시오. – Aerovistae

+1

이 질문에 대한 답변이 없으므로 문맥에 관한 것입니다. 나는 그것을 '너무 광범위하다'고 선언했다. –

답변

1

문자열을 사용하여 수행하는 작업에 따라 크게 다릅니다. 파이썬이 문자열을 저장하는 방법을 정확히 모르겠지만 XEmacs (GNU Emacs와 유사) 및 Python과 같은 동적 언어 인 Emacs Lisp의 기본 구현에 대해 많은 작업을 수행했으며 문자열이 거기에서 구현되었습니다. 문자열은 배열과 비슷한 메모리 블록으로 저장됩니다. 파이썬에서 커다란 배열을 만드는 데는 큰 문제가 없으므로 단순히 문자열을이 방법으로 저장하면 성능 문제가 발생할 것이라고 생각하지 않습니다. 그래도 고려할 사항 :

  1. 문자열을 어떻게 구성하고 있습니까? 아주 큰 문자열에 간단히 추가하여 조각별로 작성한다면 O (N^2) 알고리즘은 매우 느릴 것입니다. Java는 StringBuilder 클래스로 이것을 처리합니다. 파이썬에서 정확히 동일한 기능이 있는지는 잘 모르겠지만, 합치려는 모든 부분을 가진 배열을 간단하게 만들 수 있습니다. 그리고 나서 ''.join(array)을 사용하여 끝에 합류하십시오.

  2. 문자열을 검색해야합니까? 이것은 문자열 생성과 관련이 없지만 고려해야 할 사항입니다. 검색은 일반적으로 문자열 크기의 O (n)이됩니다. 그것을 O (n/m)로 만드는 스피드 업이 있습니다. 여기서 m은 검색하려는 하위 문자열의 크기입니다.하지만 그것에 관한 것입니다. 주요 고려 사항은 하나의 큰 문자열 또는 일련의 하위 문자열을 저장할 것인지 여부입니다. 모든 하위 문자열을 검색해야하는 경우 큰 문자열을 검색하는 데 많은 도움이되지 않지만 일부 부품을 검색 할 필요가 없다는 것을 미리 알고있을 수도 있습니다.

  3. 하위 문자열에 액세스해야합니까? 다시 말하지만, 이것은 문자열 생성과 관련이 없으며, 고려해야 할 사항입니다. 하위 문자열을 위치별로 액세스하는 것은 올바른 메모리 위치로 인덱싱하는 것입니다. 그러나 큰 하위 문자열을 가져와야하는 경우 비효율적 일 수 있으며 문자열을 하위 문자열 배열로 저장하여 작업 속도를 향상시킬 수 있습니다. 공유 된 문자열 중 일부가 포함 된 다른 배열로 새 문자열을 만듭니다. 그러나 이런 방식으로 작업하는 것은 작업이 필요하며 실제로 필요하지 않으면 완료하지 않아야합니다.

는 합계에서, 나는이 같은 큰 문자열을 가지고 괜찮 간단한 경우에 생각하지만, 당신은 당신이 수행하는거야 작업의 종류와 어떤 그들의 O (...) 시간이 생각해야 .

0

내가 잠재적 인 문제는 두 가지에 달려 있다고 말할 것입니다 : 메모리 (램)의 용량에 비해

  • 동시에 메모리에 보류 얼마나 많은 문자열이 가지이다?

  • 이 문자열에서 수행되는 작업은 무엇입니까?
    파이썬에서 문자열에 대한 연산은 매우 효율적이므로 매우 긴 문자열에서 작동하는 문제를 제시하지 않는다고 읽었습니다. 그러나 사실 그것은 큰 문자열에서 수행 된 각 연산의 알고리즘에 달려 있습니다.

이 답변은 다소 모호합니다. 문제에 대한보다 유용한 평가를하기에 충분한 eperience가 없습니다. 그러나 문제는 매우 광범위합니다.

관련 문제