복붙노트

[PYTHON] 메모리에 큰 목록을 유지하는 대안 (파이썬)

PYTHON

메모리에 큰 목록을 유지하는 대안 (파이썬)

파이썬에서 사용 가능한 메모리 주소 공간 (32 비트 파이썬)을 초과 할 수있는 목록 (또는 배열, 사전 ....)이 있다면 옵션과 상대적인 속도는 무엇입니까? (그 목록을 크게하지 않는 것 이외에) 목록은 메모리를 초과 할 수 있지만 손을 미리 알 수있는 방법이 없습니다. 일단 75 %를 초과하면 메모리 (또는 새 항목)에 더 이상 목록을 보관하지 않으려 고합니다. 중간에 파일 기반 방식으로 변환 할 수있는 방법이 있습니까?

가장 좋은 (속도 및 속도) 파일 ​​저장 옵션은 무엇입니까?

간단한 숫자 목록 만 저장하면됩니다. 무작위로 N 번째 요소에 액세스 할 필요가 없으며 / 팝 유형 작업 만 추가하면됩니다.

해결법

  1. ==============================

    1."숫자"가 간단하다면 (각각 최대 4 바이트의 부호있는 또는 부호없는 정수 또는 각각 4 또는 8 바이트의 부동 소수점), 나는 표준 라이브러리 배열 모듈을 수백만 개를 유지하는 가장 좋은 방법으로 추천한다. (바이너리 R / W 용으로 열리는) 바이너리 파일을 사용하여 디스크의 나머지 구조를 백업합니다. array.array는 매우 빠른 fromfile 및 tofile 메소드를 사용하여 데이터 이동을 앞뒤로 용이하게합니다.

    "숫자"가 간단하다면 (각각 최대 4 바이트의 부호있는 또는 부호없는 정수 또는 각각 4 또는 8 바이트의 부동 소수점), 나는 표준 라이브러리 배열 모듈을 수백만 개를 유지하는 가장 좋은 방법으로 추천한다. (바이너리 R / W 용으로 열리는) 바이너리 파일을 사용하여 디스크의 나머지 구조를 백업합니다. array.array는 매우 빠른 fromfile 및 tofile 메소드를 사용하여 데이터 이동을 앞뒤로 용이하게합니다.

    즉, 기본적으로 부호없는 긴 숫자를 가정하면 다음과 같습니다.

    import os
    
    # no more than 100 million items in memory at a time
    MAXINMEM = int(1e8)
    
    class bigarray(object):
      def __init__(self):
        self.f = open('afile.dat', 'w+')
        self.a = array.array('L')
      def append(self, n):
        self.a.append(n)
        if len(self.a) > MAXINMEM:
          self.a.tofile(self.f)
          del self.a[:]
      def pop(self):
        if not len(self.a):
          try: self.f.seek(-self.a.itemsize * MAXINMEM, os.SEEK_END)
          except IOError: return self.a.pop()  # ensure normal IndexError &c
          try: self.a.fromfile(self.f, MAXINMEM)
          except EOFError: pass
          self.f.seek(-self.a.itemsize * MAXINMEM, os.SEEK_END)
          self.f.truncate()
        return self.a.pop()
    

    물론 필요한 경우 다른 메소드를 추가 할 수 있습니다 (예 : 전체 길이를 추적하고 확장을 추가하는 등). 팝업 및 추가가 실제로 필요한 경우 모두 지원해야합니다.

  2. ==============================

    2.목록 데이터를 메모리 대신 파일에 저장하는 수십 가지 방법이 있습니다. 어떻게 선택 하느냐는 전적으로 데이터에서 수행해야하는 작업의 종류에 달려 있습니다. N 번째 요소에 무작위로 액세스해야합니까? 모든 요소를 ​​반복해야합니까? 특정 기준과 일치하는 요소를 검색 할 예정입니까? 목록 요소는 어떤 형식을 취합니까? 목록 끝나 중간에 삽입 하시겠습니까? 디스크의 대량 항목과 함께 메모리에 보관할 수있는 메타 데이터가 있습니까? 등등.

    목록 데이터를 메모리 대신 파일에 저장하는 수십 가지 방법이 있습니다. 어떻게 선택 하느냐는 전적으로 데이터에서 수행해야하는 작업의 종류에 달려 있습니다. N 번째 요소에 무작위로 액세스해야합니까? 모든 요소를 ​​반복해야합니까? 특정 기준과 일치하는 요소를 검색 할 예정입니까? 목록 요소는 어떤 형식을 취합니까? 목록 끝나 중간에 삽입 하시겠습니까? 디스크의 대량 항목과 함께 메모리에 보관할 수있는 메타 데이터가 있습니까? 등등.

    한 가지 가능성은 데이터를 관계형으로 구성하고 SQLite 데이터베이스에 저장하는 것입니다.

  3. ==============================

    3.대답은 대단히 "의존적"입니다.

    대답은 대단히 "의존적"입니다.

    목록에 무엇을 저장하고 있습니까? 문자열? 정수? 사물?

    얼마나 자주 목록을 읽는 것과 비교하여 작성합니까? 항목은 끝에 만 추가됩니까, 아니면 항목을 중간에 수정하거나 삽입 할 수 있습니까?

    끝까지 추가하는 중이라면 플랫 파일에 쓰는 것이 가장 효과적 일 수 있습니다.

    문자열과 같은 가변 크기의 객체를 저장하는 경우 각 문자열의 시작 부분에 메모리 내 색인을 보관할 수 있으므로 신속하게 읽을 수 있습니다.

    사전 동작을 원한다면 db 모듈, dbm, gdbm, bsddb 등을보십시오.

    랜덤 액세스 쓰기를 원한다면 SQL 데이터베이스가 더 좋을 수도 있습니다.

    어떤 일을하든, 디스크로가는 것은 메모리보다 훨씬 느릴 것입니다. 그러나 데이터가 어떻게 사용될 것인지 알지 못하면 더 구체적 일 수는 없습니다.

    편집하다: 업데이트 된 요구 사항에서 플랫 파일로 이동하여 마지막 N 개 요소의 메모리 내 버퍼를 유지합니다.

  4. ==============================

    4.자, 속도를 찾고 데이터가 자연적으로 숫자라면 numpy와 PyTables 또는 h5py를 사용하는 것을 고려해 볼 수 있습니다. 내가 기억하는 바로는 인터페이스는 단순한 목록만큼 좋지는 않지만 확장 성은 환상적입니다!

    자, 속도를 찾고 데이터가 자연적으로 숫자라면 numpy와 PyTables 또는 h5py를 사용하는 것을 고려해 볼 수 있습니다. 내가 기억하는 바로는 인터페이스는 단순한 목록만큼 좋지는 않지만 확장 성은 환상적입니다!

  5. ==============================

    5.피클을 기반으로하는 shelf python 모듈을 확인 했습니까?

    피클을 기반으로하는 shelf python 모듈을 확인 했습니까?

    http://docs.python.org/library/shelve.html

  6. ==============================

    6.목록이 아닌 생성자 또는 사용자 지정 반복기를 사용하여 작업을 수행하는 방법을 알아내는 등 다양한 종류의 구조를 고려할 수 있습니다.

    목록이 아닌 생성자 또는 사용자 지정 반복기를 사용하여 작업을 수행하는 방법을 알아내는 등 다양한 종류의 구조를 고려할 수 있습니다.

  7. ==============================

    7.최신 운영 체제는 걱정할 필요없이이 문제를 처리합니다. 가상 메모리라고합니다.

    최신 운영 체제는 걱정할 필요없이이 문제를 처리합니다. 가상 메모리라고합니다.

  8. ==============================

    8.문서 지향 데이터베이스는 어떻습니까? 몇 가지 대안이 있습니다. 저는 현재 CouchDB가 가장 잘 알려져 있다고 생각합니다.하지만 Tokyo Cabinet 또는 MongoDB에 갈 수도 있습니다. 마지막 모듈은 추가 모듈이 필요없이 주요 프로젝트에서 직접 파이썬 바인딩을 사용할 수 있다는 장점이 있습니다.

    문서 지향 데이터베이스는 어떻습니까? 몇 가지 대안이 있습니다. 저는 현재 CouchDB가 가장 잘 알려져 있다고 생각합니다.하지만 Tokyo Cabinet 또는 MongoDB에 갈 수도 있습니다. 마지막 모듈은 추가 모듈이 필요없이 주요 프로젝트에서 직접 파이썬 바인딩을 사용할 수 있다는 장점이 있습니다.

  9. ==============================

    9.blist 시도 할 수 있습니다. https://pypi.python.org/pypi/blist/

    blist 시도 할 수 있습니다. https://pypi.python.org/pypi/blist/

  10. from https://stackoverflow.com/questions/1989251/alternatives-to-keeping-large-lists-in-memory-python by cc-by-sa and MIT license