2009-02-07 10 views
13

디스크의 파일에 별도의 연결을 사용하여 해시 테이블을 저장할 수 있습니까?해시 테이블을 파일에 저장하는 방법은 무엇입니까?

런타임에 해시 테이블에 저장된 데이터를 생성하는 것은 비용이 많이 들며 디스크에서 HT를로드하는 것이 더 빠릅니다.

편집 : 조회는 메모리에로드 된 HT로 수행됩니다. 해시 테이블 (메모리에)을 바이너리 형식의 파일에 저장하는 방법을 찾아야합니다. 그래서 다음에 프로그램이 실행될 때 디스크에있는 HT를 RAM에로드 할 수 있습니다.

저는 C++을 사용하고 있습니다.

+0

디스크에서 조회를 수행 하시겠습니까, 아니면 해시 테이블을 유지해야합니까? – Hank

+0

행크, 룩업은 메모리에로드 된 HT로 수행됩니다. 그래, 해시 테이블을 유지하면된다. – Girish

+0

자세한 내용 - 언어, 시스템 등을 입력하십시오. –

답변

6

어떤 언어를 사용하고 있습니까? 일반적인 방법은 일종의 이진 직렬화를 수행하는 것입니다.

좋아, 언어를 추가하도록 편집했습니다. C++에는 몇 가지 옵션이 있습니다. 나는 Boost 직렬화 메커니즘이 꽤 좋다고 믿는다. 또한 Boost의 직렬화 라이브러리 페이지는 대안을 설명합니다. 여기서 링크는 :

http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html

+0

> 사용중인 언어는 무엇입니까? C++을 사용하고 있습니다. > 일반적인 방법은 일종의 이진 직렬화를 수행하는 것입니다. 이것에 대해 자세히 설명해 주시겠습니까? 나는 바이너리 직렬화에 대해서 모른다. 저는 이것을 저에게도 연습으로 추가하고 싶습니다. 그래서 저는 모두 손으로 그것을하고 싶습니다. :) – Girish

5

가정 C/C++ : 사용 어레이 인덱스와 고정 크기 구조체 대신 포인터와 가변 길이 할당. 나중에 read()를하기 위해 데이터 구조체를 파일에 직접 write() 할 수 있어야한다.

더 높은 수준의 경우 : 많은 고급 언어 API에는 일련 번호 지정 기능이 있습니다. Java와 Qt/C++에는 모두 마음을 빠르게 뜨는 방법이 있으므로 다른 사람들도 잘 알고 있습니다.

2

아마도 DBM이 유용 할 수 있습니다.

+0

라이센스를 확인 했습니까? 앱을 오픈 소스로 만들거나 슬리피 캣의 라이센스 요금을 지불해야한다. –

5

직렬화 (예 : in Java)를 사용하여 전체 데이터 구조를 디스크에 직접 쓸 수 있습니다. 그러나 요소에 액세스하기 위해 전체 객체를 메모리로 다시 읽도록 강요받을 수 있습니다. 이것이 실용적이지 않다면, random access 파일을 사용하여 해시 테이블의 요소를 저장할 것을 고려할 수 있습니다. 체인에서 다음 요소를 나타 내기 위해 포인터를 사용하는 대신 파일의 바이트 위치 만 사용하면됩니다.

+0

Zach, <관련없는 질문> 아직 스택 오버플로가 새로 생겼습니다. 어떻게 개별 게시물에 응답 할 수 있습니까? 다른 사람들 게시물 (답변)과 함께 나타나도록 게시물을 작성하거나 의견 ("의견 추가")을 통해 개별 게시물에 응답해야합니까? – Girish

+0

@ Girish : 커뮤니티에 오신 것을 환영합니다. =) 귀하의 답변이 게시물에 관한 간결하고 구체적인 경우, 의견을 추가하십시오. 다른 사람들에게 유용 할 수있는 더 긴 응답은 원래 질문에 있어야합니다 ("편집"을 클릭하십시오). 답변이 없으므로 응답이나 추가 정보를 새로운 답변으로 게시하지 마십시오. –

+0

알겠습니다. 고마워요. 임의 액세스 파일이란 파일을 fseek()하는 것을 의미합니까? ... 확실하지 않다. – Girish

1

해시 테이블 구현이 좋으면 해시 및 각 개체의 데이터를 저장하십시오. 해시를 사용하면 개체를 테이블에 넣는 것이 비용이 많이 들지 않아야하며 테이블이나 체인을 직렬화하지 않아도됩니다. 저장과로드 사이의 정확한 구현.

3

색인 용 포인터를 버립니다.

디스크에있는 DAWG을 구성하는 것과 조금 비슷합니다. 그렇게 아주 멋지게 만든 이유는 파일을 읽지 않고 직접 mmap을로드 할 수 있기 때문입니다. 해시 공간을 관리 할 경우, 나는 이런 식으로 뭔가를 할 것이라고 생각, 2 16 2 24 개 항목을 말 :

  • 무료 인덱스의 목록을 유지합니다. 테이블이 비어 있으면 각 체인 인덱스는 다음 인덱스를 가리 킵니다.
  • 체인이 필요할 때 테이블의 여유 공간을 사용하십시오.당신이 불법 거주자 (다른 곳에서 오버 플로우)에 의해 점령 것 인덱스에 뭔가를 넣어해야하는 경우
  • :
    • 기록 인덱스
    • 스왑 (의가 N을 부르 자) 새 요소 및 불법 거주자
    • 새로운 자유 지수 (F)에 불법 점거자를 놓는다. 당신이 완전 무료 인덱스 부족하면
    • 가 불법 거주자의 해시 인덱스에 체인을 따라 F.
  • 와 N을 대체하기 위해, 당신은 아마 더 큰 테이블이 필요하지만, 당신은시, mremap를 사용하여 조금 더 대처할 수 테이블 뒤에 여분의 방을 만들 수 있습니다.

이렇게하면 수정할 필요없이 직접 테이블을 mmap하고 사용할 수 있습니다. (OS 캐시에서라면 무서운 속도가 빠릅니다!)하지만 포인터 대신 인덱스로 작업해야합니다. syscall-round-trip-time에서 메가 바이트를 사용할 수 있다는 것은 매우 유감 스럽지만 페이징 때문에 실제 메모리보다 메가 바이트를 적게 차지합니다.

관련 문제