2009-05-21 3 views
2

사용자가 회사 및 날짜 쌍의 목록을 제출하고 해당 날짜에 뉴스 이벤트가 있었는지 여부를 확인할 수있게하려는 응용 프로그램을 작성 중입니다. 뉴스 이벤트는 회사 식별자와 날짜를 키로하여 사전에 저장됩니다. 사전을로드하는 것보다 디스크에서 목록을 읽을 수 있습니까?

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 시간 동안 사전에 데이터를 정리하고 포기하기 전에 보냈습니다. 데이터베이스를 구현하는 데 걸리는 시간을 소비 한 다음로드하기 위해 다른 사람의 메모리 중 절반 이상을 사용하고 있음을 확인하십시오.

답변

5

이렇게 많은 양의 데이터가 있으면 데이터베이스를 사용해야합니다. 이것은 목록을 보는 것보다 훨씬 좋을 것이며 어쨌든 데이터를 저장하는 가장 적절한 방법이 될 것입니다. 파이썬을 사용한다면 SQLite가 내장되어 있다고 생각합니다.

+0

데이터베이스를 사용하면 어떤 이점이 있습니까? – PyNEwbie

+0

기본적으로 코딩중인 모든 기능은 이미 다른 SQL 호출을 통해 존재하므로 데이터베이스의 테이블을 기반으로 원하는 모든 종류의 목록을 모두 만들 수 있습니다. 데이터베이스는 RAM으로 운반하는 데이터를 저장하지 않을 수도 있습니다. 이는 거대한 플러스입니다. – AlbertoPL

+0

Sqlite는 Python의 표준 모듈이며 Elixir (SQLAlchemy)와 테이블/쿼리 관리자를 권장합니다. – monkut

1

사전은 사실상 해시이기 때문에 더 많은 메모리를 사용합니다.

조회 요구 사항이 매우 간단하므로 데이터베이스를 사용할 필요가 없습니다. 파일 시스템 만 사용하십시오.

각 날짜의 하위 디렉터리가있는 회사 이름 (또는 시세 표시기)을 기반으로 디렉터리 구조를 만듭니다. 데이터의 존재 여부를 확인하고 데이터를로드하려면 데이터가있는 하위 디렉토리의 이름을 구성하고 존재하는 지 확인하십시오.

예를 들어 사실 5 월 21 일의 IBM 뉴스는 해당 날짜에 대한 뉴스가있는 경우 C : \ db \ IBM \ 20090521 \ news.txt에 있습니다. 파일이 있는지 그냥 확인하십시오. 검색이 없습니다.

거기에서 속도를 높이려면 서버를 운영한다고 가정 할 때 자주 요구되는 제한된 양의 결과를 캐시하는 체계가 필요합니다. 이를 위해 해시를 사용합니다.

+0

똑똑한 +1, 복잡한 디렉토리 구조를 추가하고 싶지는 않지만 300K 식별자를 사용하면 디렉토리 구조를 걸을 때 매우 힘들어집니다. – PyNEwbie

+0

물론 한 곳에서 수천 명이 필요하지는 않습니다. 따라서 세분화하고 C : \ db \ I \ B \ M \ 2009 \ 05 \ 21 \ news.txt를 만듭니다. –

+0

그리고 sqlite를 사용하는 것보다 쉽습니다. –

관련 문제