2013-03-06 1 views
3

저는 시뮬레이션을 작성하는 계획 단계에 있으며 메모리 및 속도 고려 사항을 기반으로 데이터를 표현하는 방법에 대한 아이디어가 필요합니다.시뮬레이션 시스템의 경우 어떤 데이터 구조가 가장 적합합니까?

각 시간 단계에서 시뮬레이션 프로세스는 10^3에서 10^4 개의 새 데이터 레코드를 생성하고 각각의 새 레코드 또는 기존 레코드 (10^6에서 10^8까지)를보고 삭제합니다 수정합니다.

각 레코드에는 3-10 개의 간단한 필드가 있으며 각 필드에는 정수 또는 여러 ASCII 문자의 문자열이 있습니다. 또한 각 레코드에는 1-5 개의 다른 필드가 있으며 각 필드에는 정수가 들어있는 가변 길이 목록이 있습니다. 일반적인 레코드의 무게는 100-500 바이트입니다.

수정 또는 삭제 프로세스는 다음과 같이 작동합니다.이 레코드의 경우 인수가이 레코드의 필드 일부 값과 다른 레코드의 필드 값인 함수를 계산합니다. 결과에 따라 프로세스는 필드를 삭제하거나 수정하기 위해 준비합니다.

그런 다음 서로 다른 레코드에 대해 반복하십시오. 그런 다음 다음 레코드로 이동하고 반복하십시오. 모든 레코드가 처리되면 시뮬레이션은 다음 시간 단계로 이동할 준비가됩니다.

다음 시간 단계로 이동하기 전에 준비된대로 모든 삭제 및 수정 사항을 적용하십시오.

허용되는 레코드가 많을수록 시뮬레이션이 좋습니다. 모든 레코드가 RAM에 있다면, 단점은 시뮬레이션 크기이며 아마 위쪽은 속도입니다. 시뮬레이션은 실시간 일 필요는 없지만 분명히 너무 느리게하는 것은 아닙니다.

메모리의 각 레코드를 나타내려면 목록 또는 dict (중첩 된 일부 목록 포함) 또는 클래스 인스턴스 중 하나를 선택해야합니다. 모든 레코드를 저장하고 다른 날에 시뮬레이션을 계속하려면 다음과 같은 옵션을 사용합니다. csv 파일은 각 레코드가 레코드이거나 RAM에 모든 레코드를 넣은 다음 파일에 저장합니다 (아마도 피클), 또는 일종의 데이터베이스를 사용하십시오.

저는 파이썬 기초와 발전기와 같은 몇 가지 개념을 배웠지 만 데이터베이스를 배운 적이 없으며 산 세척을 시도하지 않았으며 더 많은 것을 배울 필요가 있습니다. 가능하다면 1이 있기 때문에 여러 대의 컴퓨터를 사용하지 않아야합니다. 동시성은 너무 무서워 보입니다.

메모리에 레코드를 표현하는 방법과 시뮬레이션 된 시스템을 저장하는 방법에 대해 조언 하시겠습니까?

+0

가장 간단한 방법으로 먼저 시작하고 필요에 따라 [충분한] 추상화를 그대로 둡니다. 어쨌든 "키 값 저장소"또는 "지속 된 해시 저장소"를 살펴볼 가치가 있습니다. –

답변

1

최악의 경우 레코드 당 10 ** 8 레코드와 500 바이트가 걸리면 많은 RAM이되므로 유연성을 설계하고 모든 레코드가 항상 RAM에있는 것은 아니라고 가정하십시오. 레코드가 어디에 있는지에 대한 세부 정보를 숨기는 추상 클래스를 만들 수 있습니다.

class Record(object): 
    def __init__(self, x, y, z): 
     pass # code goes here 
    def get_record(id): 
     pass # code goes here 
대신이 이름 __index__()을 사용할 수있는 다음 클래스 목록과 같은 역할을합니다 get_record() 이름을 사용

,하지만 데이터베이스에 외출, 또는 RAM 캐시, 또는 무엇이든을 참조 할 수 있습니다. ID 값으로 정수를 사용하기 만하면됩니다. 그런 다음 persistence store (데이터베이스에서 피클 (pickle)로 전환)에 대한 생각을 바꾸면 실제 코드는 변경되지 않습니다.

또한 실제로 거대한 스왑 파일을 만들고 가상 메모리 시스템이 실제 RAM에 들어가고 나가는 레코드를 처리하도록 할 수 있습니다. 이것은 쉽게 시도 할 수 있습니다. 계산을 중단하고 상태를 저장하는 쉬운 방법이 없습니다.

각 레코드를 터플로, 심지어 명명 된 튜플로 표현할 수 있습니다.튜플은 파이썬에서 "컨테이너"객체의 오버 헤드가 가장 낮을 것이라고 생각합니다. (명명 된 튜플은 이름을 한 곳에서 한 번만 저장하기 때문에 오버 헤드가 적습니다.)

관련 문제