2014-10-24 2 views
0

좋은 날,파일의 대용량 데이터 세트에 사용할 데이터 구조

주어진 파일 (file1)에서 큰 데이터 세트를 처리하는 데 관련된 연구를 수행하고 있습니다. 내 이해에서 데이터 저장소는 데이터 구조와는 다른 수준이지만 겹치는 영역, 예를 들어 데이터 구조는 디스크 저장소뿐 아니라 메모리에있는 데이터의 배열입니다.

다른 파일 (주어진 file2)을 사용하고 첫 번째 주어진 파일 (file1)의 값과 각 값을 비교하여 파일의 존재 여부를 확인해야합니다.

파일을 비교할 때 결과를 다른 파일 (file3)에 덤프합니다. 이 파일은 다른 열로 구성 될 것입니다. (열을 언급 했으므로 file3 대신 결과로 데이터베이스를 사용했을 가능성이 있습니까?)

위에서 말한 내용을 바탕으로 빠른 검색/조회를 찾는 것처럼 보입니다. 파일 간 비교).

제 질문은 이것이 데이터 구조에 더 적합하다고 생각합니까? 그렇지 않으면 파일을 검색해야합니까? 내가 검색/조회 작업을 찾고 있다고 언급했는데, 검색 할 때 일정 시간 O (1)가있는 해시 테이블을 향해 기울고있다. 다른 시간에는 데이터 구조가 이미 다른 저장 메커니즘 (파일)을 사용하여 생성 된 데이터를 처리하기에 과잉이라고 생각하고 데이터 구조는 우리가 갈 때 데이터를 입력 할 때 가장 남을 것입니다.

희망 말이된다. 나는 생각에 옳은가?

+0

G'day :) 한 번 작업이고 데이터 파일이 너무 크지 않으면 Excel을 사용합니다.이 작업이 반복적으로 수행되거나 데이터가 Excel에 적합하지 않은 경우 SQL 서버는 편리합니까? 이렇게하면 데이터 가져 오기를 구현하고 간단한 쿼리를 작성해야합니다. 데이터 저장소, 구조, O (무언가) 검색 알고리즘 등을 생각할 필요가 없습니다. 물론 이것은 단지 실용적인 접근입니다. – Arvo

+0

감사합니다. 데이터를 사용할 수 없지만 시간이 지남에 따라 데이터 구조가 사용됩니까? – user2770982

+0

죄송합니다, 이해할 수 없습니다. (나는 영어로 말하는 사람이 아니다.) – Arvo

답변

1

작은 파일의 경우 모든 것을 키로 인덱싱 된 해시 테이블로 읽을 수 있습니다.

큰 파일의 경우 파일을 스캔하고 키와 파일 오프셋을 해시 테이블에 저장할 수 있습니다.

Pseduo-C 번호 :

var lookup = new Dictionary<string, long>(); // Hashtable 

foreach (Record record1 in EnumerateRecords(file1)) 
{ 
    lookup[record1.Key] = file1.Position - sizeof(Record); 
} 

foreach (Record record2 in EnumerateRecords(file2)) 
{ 
    long file1Position; 
    if (lookup.TryGetValue(record2.Key, out file1Position)) 
    { 
     // Record exists in both files 
     file1.Seek(file1Position); 
     Record record1 = ReadRecord(file1); 
     Process(record1, record2); 

     // Remove what we found, so we know what is in file1 
     // but not in file2 
     lookup.Remove(record2.Key); 
    } 
    else 
    { 
     // Record exists only in file2 
     Process(null, record2); 
    } 
} 

foreach (var keyValuePair in lookup) 
{ 
    // Record exists only in file1 
    var file1Position = keyValuePair.Value; 
    file1.Seek(file1Position ; 
    var record1 = ReadRecord(file1); 
    Process(record1, null); 
} 

당신이, 당신이 두 파일을 검색하고 오프셋을 저장할 수해야하는 경우

. 그런 다음 일치하는 두 개의 해시 테이블을 비교합니다.

관련 문제