7

IList로 구현 된 거대한 시계열에서 시간순으로 작업을 수행해야합니다. 데이터는 궁극적으로 데이터베이스에 저장되지만 수천만 개의 쿼리를 데이터베이스에 제출하는 것은 의미가 없습니다."메모리에있는"큰 데이터 세트를 저장하기위한 메모리 매핑 파일 IList 구현?

현재 메모리 내 IList는 8 백만 개가 넘는 (작은) 객체를 저장할 때 OutOfMemory 예외를 트리거하지만 수천만 건을 처리해야합니다.

약간의 연구 끝에 디스크에 데이터를 저장하고 IList 래퍼를 통해 데이터에 액세스하는 것이 가장 좋은 방법 인 것처럼 보입니다.

Memory-mapped files (.NET 4.0에 도입)은 올바른 인터페이스처럼 보이지만 IList (쉽게 액세스 할 수 있도록)를 구현하고 내부적으로 메모리 매핑 파일을 처리해야하는 클래스를 작성하는 가장 좋은 방법은 무엇인지 궁금합니다.

다른 방법에 대해 알고 있다면 나는 또한 호기심이 많습니다. 나는 db4o (someone mentionned here)의 데이터를 사용하는 IList 래퍼를 메모리 매핑 파일을 IoAdapterFile로 사용하고 있지만 db4o를 사용하면 아마도 메모리 매핑 파일을 직접 처리하는 것보다 성능 비용이들 것이라고 생각했습니다.

나는 this question을 2009 년에 들러 왔지만 유용한 대답이나 진지한 아이디어를 얻지 못했습니다.

+0

는 메모리 일부만 매핑하는 "슬라이딩 윈도우"의 일종을 사용하는 것을 제외하고)

  • 메모리 맵 파일과 고정 구조 크기 오프셋 비아 (어레이 형 액세스)를 사용하지만, 실제 메모리 조심은 한계 순차적으로 수행하는 작업은 무엇입니까? 또는 전체 데이터를 한꺼번에 조작하고 있습니까? – Yahia

  • +0

    액세스는 순차적이어야하며 (업데이트를 수행하기 위해 컬렉션을 반복하는), 또한 상대방에서 개체를 삭제/제거 할 수 있어야합니다. –

    +2

    데이터베이스가이 작업에 적합한 도구입니다. 너무 많은 데이터베이스 호출을 피하려면 일} 처리로 데이터를 갱신하십시오. 또한 맵 감속 스타일 처리에 관심이있을 수 있습니다. – dtb

    답변

    8

    이 문자열은 PersistentDictionary<>이지만 문자열로만 작동하며 소스 코드를 읽으면 매우 큰 데이터 세트 용으로 설계된 것인지 확실하지 않습니다.

    확장 성이 뛰어난 (최대 16TB), ESENT PersistentDictionary<>은 Windows (XP +)에있는 ESENT 데이터베이스 엔진을 사용하며 단순 유형을 포함하는 모든 직렬화 가능 객체를 저장할 수 있습니다.

    Disk Based Data Structures, including Dictionary, List and Array with an "intelligent" serializer 정확히 찾고 싶었지만 특히 "원시".NET MemoryMappedFiles를 사용하지 않았으므로 매우 큰 데이터 세트로 원활하게 실행되지 않았습니다. 32 비트 시스템에 대한 지원은 실험적입니다. .

    업데이트 1 : .NET MemoryMappedFiles를 광범위하게 사용하는 자체 버전을 구현했습니다. 그것은 매우 빠르며 좀 더 범용적인 용도로 사용하면 Codeplex에서 공개 할 것입니다.

    업데이트 2 : TeaFiles.Net 또한 제 목적으로 훌륭했습니다. 강력 추천 (무료).

    +0

    경험을 공유해 주셔서 감사합니다. 나도 같은 문제에 직면 해있다. 이미 Codeplex에 구현을 게시했는지 여부를 궁금해했다. 고맙습니다. – alhazen

    +0

    안녕하세요, 아직 없습니다. 현재 가지고있는 제약 조건 중 하나는 모든 개체를 값 유형으로 저장해야한다는 것입니다. 이 경우 (또는 참조 유형에서 값 유형으로 마이그레이션 할 수 있음) Codeplex에 게시하기 전에 코드를 공유 할 수 있습니다. –

    +0

    @ErwinMayer 어딘가에서 코드를 공유했는지 궁금합니다. 일부 큰 개체에 대해 파일 지원 IList 구현이 필요합니다. –

    1

    메모리 매핑 된 파일은 좋은 방법입니다. 그러나 무작위로 물건에 액세스해야하는 경우 매우 느리게 진행됩니다.

    아마도 메모리에 저장할 때 고정 구조체 크기를 생각해 낼 수 있습니다. 가능한 경우 오프셋을 목록 항목 ID로 사용하십시오. 그러나 삭제/정렬은 항상 문제입니다.

    +0

    AFAIK, 우리가 바이트 오프셋을 알고 있다면 랜덤 액세스는 O (1)이어야합니다. –

    3

    내가 몇 가지 옵션을 볼 수 없습니다 :

    • "메모리-DB"SQLite는이 방법을 사용할 수 있습니다 예를 들어
      을 - 등 단지 DLL 배포 어떤 설정이 필요 (1 또는 2) 함께 응용 프로그램과 나머지는 프로그래밍 방식으로 수행 할 수 있습니다.
    • 알 수없는 (그러나 큰) 양의 데이터가있는 임시 테이블에 모든 데이터를로드하면 처리 속도가 빨라집니다. whcih가 더 나은 DB 안에!만약
    관련 문제