2013-09-03 5 views
0

분석 할 필요가있는 매우 큰 사전이 있습니다.큰 사전을 저장하십시오. 메모리를 제한하십시오.

사전이 어떻게 존재하게 되었습니까?

사전은 로그 파일의 피벗 테이블입니다. 매일 재고 목록을 보유하고 있으며, 지난 달 스냅 샷을 가지고 있습니다.

2013-01-01 Apple 1000 
2013-01-01 Banana 2000 
2013-01-01 Orange 3000 
.... 

을 그리고, I 그룹의 모든 제품 이름으로 기록하고 나중에 시계열 분석을 할 계획 :

각 스냅 샷은 다음과 같습니다. 내가 가진 출력은 다음과 같습니다 아시다시피

{ 
Apple:[(2013-01-01,1000),(2013-01-02, 998),(2013-01-03,950)...], 
Banana:[(2013-01-01,2000),(2013-01-02, 1852),(2013-01-03, 1232)...] 
Orange.... 
} 

, 당신은 년 및 재고 스냅 샷의 년과 매우 넓은 재고 폭을 가지고 가정 ...이 사전이 큰 것으로 밝혀졌습니다. 전체 'GROUPING'프로세스가 메모리에서 발생하고 사전 크기가 메모리 제한을 초과합니다.

메모리 사용을 특정 양 (예 : 5GB라고 가정하고 정상적인 사용을 위해 서버를 사용하지 않으려는 경우)으로 제한하고 디스크에서 작업하는 방법을 궁금합니다.

Here은 내 것과 매우 비슷한 질문이지만 'BEST VOTED'답변에 따라 실제 '빅 데이터'크기로 루프 번호를 변경하면 메모리가 여전히 빠르게 먹 힙니다.

정말 메모리를 죽이지 않는 어떤 예도 인정 될 것이고 속도는 저에게 그다지 중요하지 않습니다.

(사전 크기가 줄어들지 만 인벤토리 스냅 샷은 주기적이지 않고 일부 제품에는 스냅 샷 수가 다르므로 데이터 구조를 최적화하는 몇 가지 방법이 있습니다. 'MATRIX'아이디어는 작동하지 않음)

+0

대신 SQL 데이터베이스를 사용하지 않는 이유는 무엇입니까? –

+0

standardIO를 사용하여 대부분의 작업을하고 있는데,이 경우 데이터베이스가이 '규칙'을 약간 깨뜨린 것입니다. 거기에 사람이 읽을 수있는 내용의 파일이 있어야합니다. –

답변

1

이 시점에서 나는 사전 및 import sqlite3 사용을 중단하거나 데이터베이스가 이미 가지고있는 최적화를 구현하는 바퀴를 재발 명할 것입니다.

신속하게 시작하려면 Elixir은 매우 실용적이고 실용적인 ORM입니다.

+0

데이터베이스와 같은 것처럼 보입니다. 그래서 모든 로그 레코드를 반복하고 테이블 apple 값 (...)에 삽입하고 모든 삽입 후에 ... 모든 개별 제품을 반복하고 각 제품에 대한 모든 레코드를 가져와 하나씩 분석 하시겠습니까? –

+0

@ B.Mr.W. 성능 향상을 위해 Python 대신 SQL을 사용하여 분석 작업을 수행 할 수도 있습니다. –

관련 문제