사용자가 회사 및 날짜 쌍의 목록을 제출하고 해당 날짜에 뉴스 이벤트가 있었는지 여부를 확인할 수있게하려는 응용 프로그램을 작성 중입니다. 뉴스 이벤트는 회사 식별자와 날짜를 키로하여 사전에 저장됩니다. 사전을로드하는 것보다 디스크에서 목록을 읽을 수 있습니까?
newsDict('identifier','MM/DD/YYYY')=[list of news events for that date]
사전
는 생각-도보다 내가 세 조각으로 고장 메모리에 구축에도 큰 훨씬 더 큰 것으로 밝혀졌다, 각 조각은 회사 식별자의 특정 범위로 제한됩니다.내 계획은 사용자가 제출 한 목록을 가져 와서 회사 식별자의 사용자 목록을 사용하여 회사 이벤트가 발견 될 것으로 예상되는 특정 newsDict와 일치시키고 다음에 newsDicts를 차례로로드하여 값. 이 튜플의 하위 목록 목록과
이[('identifier','MM/DD/YYYY'),[list of news events for that date]]
내 생각은 그 다음 또 다른 목록 인 목록의 각 항목 목록에서 뉴스 이벤트를 유지하기 위해 더 나은하지 않는다면
그럼 지금 궁금 나는 각 회사의 식별자 목록의 범위를 가질 것입니다 사전을 가질 것이라고
companyDict['identifier']=(begofRangeinListforComp,endofRangeinListforComp)
내가 필요한 범위를 찾기 위해 사용자 입력을 사용하고으로 분류 식별자 및 범위의 목록을 만들 것 범위. 그런 다음 목록의 해당 섹션을 읽고 데이터를 가져 와서 출력을 구성합니다.
내가보기에 가장 큰 이유는 사전이 3 분의 1로 분해 되어도 각 섹션이 컴퓨터에로드되는 데 약 2 분이 걸리고 사전이 약 600-750Mb의 RAM을 차지한다는 것입니다.
8 백만 줄의 목록은로드하는 데 약 15 초 밖에 걸리지 않았으며 항목의 1/3을 차지하는 사전의 메모리 중 약 1/3을 사용함에 놀랐습니다.
또한 목록을 처리 할 때 목록의 행을 삭제할 수 있으므로 사용자 목록을 정리할 때 메모리가 해제됩니다.
사전을 생각하는 것이 가장 효율적인 방법이라고 생각하면 놀랍습니다. 그러나 그것에서 나의 파고는 사전이리스트보다 상당히 많은 메모리를 필요로 함을 시사한다. 다른 곳에서 다른 게시물을 읽는 것은 다른 구조가 포인터 포인터보다 비용이 많이 드는 포인터 할당을 요구할 것임을 암시합니다. 여기에 뭔가 빠져 있는데 더 좋은 방법이 있나요?
내 의견에 대한 알베르토의 대답과 응답을 읽은 후 필자는 db를 사용하는 경우 함수를 작성하는 방법을 알아 내려고 노력했습니다. 나는이 포장해야
outList=[]
massiveFile=open('theFile','r')
for identifier in sortedUserList
# I get the list and sort it by the key of the dictionary
identifierList=massiveFile[theDict[identifier]['beginPosit']:theDict[identifier]['endPosit']+1]
for item in identifierList:
if item.startswith(manipulation of the identifier)
outList.append(item)
: 지금은 내가 DB 프로그래밍에 대해 잘 모르지만
이내가 코드보다 훨씬 더 복잡 할 것 DB를 사용하여 구현하는 생각하기 때문에 여기에 다리를 절게 될 수있다 내가 db를 목록으로 변환하면 그다지 간단하지 않은 것을 보지 못했습니다.
물론이 포럼에 나를 데려 오는 이유는 간단하지 않았습니다. 나는 여전히 다른 구조를 사용하면 메모리가 적게 든다는 것을 알지 못합니다. 30000 개의 회사 식별자와 약 3600 개의 날짜가 있습니다. 내 목록의 각 항목은 OOD의 의미로 된 개체입니다.그것이 내가 고심하는 곳입니다. 오늘 아침 6 시간 동안 사전에 데이터를 정리하고 포기하기 전에 보냈습니다. 데이터베이스를 구현하는 데 걸리는 시간을 소비 한 다음로드하기 위해 다른 사람의 메모리 중 절반 이상을 사용하고 있음을 확인하십시오.
데이터베이스를 사용하면 어떤 이점이 있습니까? – PyNEwbie
기본적으로 코딩중인 모든 기능은 이미 다른 SQL 호출을 통해 존재하므로 데이터베이스의 테이블을 기반으로 원하는 모든 종류의 목록을 모두 만들 수 있습니다. 데이터베이스는 RAM으로 운반하는 데이터를 저장하지 않을 수도 있습니다. 이는 거대한 플러스입니다. – AlbertoPL
Sqlite는 Python의 표준 모듈이며 Elixir (SQLAlchemy)와 테이블/쿼리 관리자를 권장합니다. – monkut