100GB 사전을 쿼리하기 위해 C++ prog를 작성했습니다. 사전을 동일한 크기의 n 개의 파일로 분할했습니다. 모든 분할 파일은 같은 디렉토리에 있습니다. 사전은 완전히 색인화되어 있습니다. 즉, 검색어가 나오면 열려고하는 침뱉음 파일과 찾을 위치를 알고 있습니다. 제 질문은 더 나은 성능을위한 것입니다. 어떤 분할이 더 좋을까요 : (a) 작은 파일 수 또는 (b) 많은 수의 작은 파일 수? 또한 이상적인 분할은 무엇입니까?C++ : 파일 크기가 작거나 파일 수가 적습니까?
답변
나는 그 질문에 대한 직접적인 대답이 없다고 생각합니다. 오직 실험 만이 당신에게 말할 수 있습니다. 읽기를 위해 파일을 여는 데 드는 비용은 크기에 관계없이 일정해야하며 파일의 내용을 읽는 것은 물론 파일 크기에 달려 있습니다.
다른 힌트가 있습니다. 쿼리를 받았을 때 파일을 열거 나 완전히 읽거나 단어를 찾은 다음 파일을 닫고 결과를 반환 할 때까지이 경우 가정합니다 당신이 당신의 파일 또는 검색을 캐시해야 할 수 많은 개선이 경우, 비용이 많이들 수 있습니다 파일을 열고, 어쩌면 당신이 그들을 아마이 수행하지만 질의을 많이 얻을 경우 여기
- 를 진행합니다 더 나은 성능에 대한 쿼리
- 파일을 열고 읽으면 순차적으로 수행하는 것이고 이것은 t 모자는 더 많거나 적게 파일이 메모리에로드되고있다, 나는 정말 거대한 XML 파일을 처리하기 위해 xml의 원하는 덩어리만을 메모리에로드 할 수있는 자바 용 sax xml 파서를 통해 한 번왔다. C++. SAX project
총 다른 접근 방식은 인덱스 데이터베이스를 사용하는 것입니다 when is a file loaded into memory
확인하시기 바랍니다. 이 문제는 파일 열기 문제를 다룰 필요가 없습니다.
감사합니다. "크기에 상관없이 읽기 전용 파일을 여는 데 드는 비용은 유용합니다."- 이것은 분할 크기가 중요하지 않아야 함을 의미합니다. 나는 그것을 실험적으로 점검 할 것이다.이 코드는 파일을 순차적으로 읽지 않습니다. 질의어와 관련된 정보가 파일에 정확히 어디에 있는지 알기 때문에 탐색 작업을 수행합니다. –
예. 그러나 OS 및 열기 기능에 따라 파일이 메모리에로드되는 타이밍이 다릅니다. –
읽을 파일을 여는 데 드는 비용은 파일 크기와 관계가 없지만 파일 경로 (루트로 시작)에있는 각 디렉토리의 디렉토리 내용과는 관련이 없습니다. 물론 차이점은 합리적인 디렉토리에서는 무시해도됩니다. 즉, 10 개의 파일이있는 디렉토리와 100 개의 파일이있는 디렉토리에서 파일을 열 때 차이점을 보지 말아야합니다. 하지만 백만 개의 파일이있는 디렉토리에서는 일이 느려질 것입니다. –
사전은 정적입니까, 아니면 런타임에 변경 될 수 있습니까?
정적 인 경우 단일 파일을 모든 용도로 사용하십시오.
동적 인 경우 색인이 "벡터"(최상의 아이디어는 아님) 인 경우 데이터 용 파일과 각 색인 용 파일을 사용하십시오.
역동적이고 인덱스가 "나무"(예 : deques 및 100 % 인접하지 않은 ADT와 같은 다른 벡터 포함) 인 경우 속도가 느리거나 별도의 색인에 색인을 저장하는 것이 합당하지 않은 한 하나의 파일을 다시 사용할 수 있습니다. 볼륨.
처음에는 파일을 열어야하며 더 이상 파일 열기/닫기 페널티가 발생하지 않아야합니다.
응용 프로그램이 64 비트라면 메모리에 전체 파일을 매핑하고 OS에서 나머지 작업을 수행하도록하십시오.
응용 프로그램이 32 비트 인 경우 메모리 매핑을 사용하여 파일에 액세스하십시오. 가능한 동시 액세스를 위해 메모리 매핑 된 "창"을 만들어야합니다 (정적 데이터의 경우 데이터 당 스레드 당 하나, 각 인덱스의 스레드 당 하나 또는 두 개).
적절하게 구현 된 데이터베이스에서 인덱싱 된 테이블을 사용하는 것이 가장 이상적입니다. 예를 들어, SQLite를 보아라. 그것은 당신 자신의 C++ 코드 안에 내장 될 수있다. – littleadv