파이썬에서 큰 텍스트 파일을 저장하고 사용하는 가장 좋은 방법

StackOverflow https://stackoverflow.com/questions/158546

  •  03-07-2019
  •  | 
  •  

문제

Python에 쓴 Boggle-Clone 용 네트워크 서버를 작성하여 사용자를 받아들이고 보드를 해결하며 플레이어 입력을 기록합니다. 내가 사용하고있는 사전 파일은 1.8MB (enable2k dictionary)이며 여러 게임 솔버 클래스에서 사용할 수 있어야합니다. 지금, 나는 각 클래스가 파일 단위를 통해 반복하고 해시 테이블 (연관 배열)을 생성 할 수 있도록하지만, 인스턴스화할수록 더 많은 솔버 클래스가 더 많은 메모리를 차지할 수 있도록합니다.

내가하고 싶은 것은 사전 파일을 한 번 가져 와서 필요한 경우 각 솔버 인스턴스로 전달하는 것입니다. 그러나 이것을하는 가장 좋은 방법은 무엇입니까? 글로벌 공간에서 사전을 가져온 다음 globals () [ 'Dictionary']로 솔버 클래스에서 액세스해야합니까? 아니면 사전을 가져온 다음 클래스 생성자에게 인수로 전달해야합니까? 이것들 중 하나가 다른 것보다 낫습니까? 세 번째 옵션이 있습니까?

도움이 되었습니까?

해결책

파일을 읽고 사전을 작성하는 코드가 포함 된 Dictionary.py 모듈을 작성하면이 코드는 처음으로 가져 오면 실행됩니다. 추가 가져 오기는 기존 모듈 인스턴스에 대한 참조를 반환합니다. 따라서 수업은 다음과 같습니다.

import dictionary

dictionary.words[whatever]

Dictionary.py가있는 곳 :

words = {}

# read file and add to 'words'

다른 팁

이 시점에서 본질적으로 싱글 톤이지만 글로벌에 대한 일반적인 주장은 적용됩니다. Pythonic Singleton-Substitute의 경우 "Borg"객체를 찾으십시오.

그것이 정말로 유일한 차이입니다. 사전 객체가 만들어지면 명시 적으로 깊은 사본을 수행하지 않는 한 새 참조를 전달할 때만 새로운 참조 만 묶는 것입니다. 각 솔버 인스턴스에 수정을 위해 개인 사본이 필요하지 않은 한 한 번만 중앙에서 한 번만 중심으로 구성됩니다.

아담, 당신이 말할 때 파이썬에서 다음을 기억하십시오.

a = read_dict_from_file()
b = a

... 당신은 실제로 아닙니다 사자 a, 따라서 더 많은 기억을 사용하면 b 같은 개체에 대한 또 다른 참조.

그래서 기본적으로 어느 당신이 제안한 솔루션 중 메모리 사용 측면에서 훨씬 나을 것입니다. 기본적으로 사전에서 읽으십시오 한 번 그리고 그것에 대한 참조에 매달려 있습니다. 글로벌 변수로 수행하든 각 인스턴스 또는 다른 것으로 전달하든 동일한 객체를 참조하고 복제하지 않습니다.

어느 것이 가장 피스닉입니까? 그것은 전체적인 벌레의 캔이지만 여기에 내가 개인적으로 할 일이 있습니다.

def main(args):
  run_initialization_stuff()
  dictionary = read_dictionary_from_file()
  solvers = [ Solver(class=x, dictionary=dictionary) for x in len(number_of_solvers) ]

HTH.

DICT에 포함 된 내용에 따라 'Shelve'또는 'AnyDBM'모듈에 관심이있을 수 있습니다. DICT와 같은 인터페이스 ( 'AnyDBM'의 키 및 항목으로 문자열, 열쇠로 문자열 및 'Shelve'의 항목으로서의 Python 객체)를 제공하지만 데이터는 실제로 DBM 파일 (GDBM, NDBM, DBHASH, DBHASH, BSDDB, 플랫폼에서 사용할 수있는 내용에 따라 BSDDB.) 요구하는대로 클래스간에 실제 데이터베이스를 공유하고 싶을 것입니다. -메모리 비트.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top