2010-04-01 3 views
7

일반 텍스트 파일에 저장된 개별 레코드를 사용하는 응용 프로그램 (현재 Python으로 작성했지만 구체적인 내용은 철저히하지만 결국 C로 작성됩니다)이 있습니다. 우리는 데이터베이스를 사용할 수 없으며 새로운 기록을 수동으로 정기적으로 추가해야합니다.큰 파일 하나 또는 여러 개의 작은 파일?

내 질문은 : 하나의 파일 (500k-1Mb)을 가지고 있고 응용 프로그램을 열어서 반복하고 파일을 찾아서 닫거나 또는 레코드를 분리하고 이름을 지정하는 것이 더 빠르지 않습니까? 응용 프로그램이 필요로하는 데이터를 찾기 위해 단순히 파일 이름을 반복 할 수 있도록 적절한 규칙?

나는 내 질문이 매우 일반적이므로 주제에 대한 좋은 기사의 방향이 제안만큼이나 높다고 생각합니다. 시간에 대한

미리 감사드립니다 아주 많이, 댄

+1

SQLite를 사용해 보셨습니까? 응용 프로그램에 코드를 추가하는 것과 크게 다르지 않습니다. 사실 공개 도메인이기 때문에 SQLite 코드를 사용하여 문자 그대로 할 수 있습니다. 애플리케이션의 속도를 벤치마킹 할 수 있습니다. – Ioan

답변

7

두 번째 방법은 인덱스입니다. 파일 시스템 자체에서 인덱스를 작성하는 것입니다. 본질적으로 이것에 문제가있는 것은 없으며 한 디렉토리에 너무 많은 파일을 갖지 않도록 배치하는 한 충분히 빠릅니다.

당신은 디렉토리의 여러 수준을 사용하여 목표 "하나의 디렉토리에 너무 많은 파일을 넣지 마십시오"달성 할 수

- 예를 들어, 키 FOOBAR와 레코드가 아니라 단지 data/FOOBAR보다 data/F/FO/FOOBAR에 저장 될 수 있습니다.

또는 키 - 오프셋 쌍의 (정렬 된) 목록을 포함하는 색인 ​​파일을 작성하여 단일 대형 파일을 수행 할 수도 있습니다. index-as 디렉토리 접근법이 떨어지는 곳은 파일 이름을 만들 때 사용한 것과 다른 키를 검색하려는 경우입니다. 색인 파일을 사용했다면이 상황에 대한 두 번째 색인을 만들면됩니다.

어쨌든 자신 만의 데이터베이스를 효과적으로 구축하기 때문에 "우리는 데이터베이스를 사용할 수 없습니다"라는 제한을 재고해야 할 수도 있습니다.

+0

대단히 감사합니다. 인덱싱은 확실히 고려해야 할 사항입니다. 불행히도 데이터베이스 제한은 우리가 제어 할 수있는 제한 사항이 아닙니다 ... – Dan

+0

"분할 된 디렉토리"를 사용하는 것은 성능상의 이유로하지 않으며 많은 작업을 처리해야 할 때 확장 성을 추가하는 순수한 방법입니다 파일 (우리는 여기에 하나의 디렉토리에 십만 개의 파일을 말하고 있습니다). –

+1

... 하나의 디렉토리에있는 수천 개의 파일이 불량한 이유는 천천히입니다. – caf

2

일반적으로 여러 개의 작은 파일을 가지고하는 것이 좋습니다. 메모리 사용량을 낮게 유지하고 검색 할 때 성능이 훨씬 좋습니다.

그러나 파일 시스템 호출은 예를 들어 메모리 저장소와 비교할 때 훨씬 비용이 많이 들기 때문에 필요한 작업량에 따라 다릅니다.

1

일반적으로 하나의 큰 파일을 갖는 것은 업데이트하기가 어려울 수 있지만 작은 파일을 많이 가지는 것은 피치입니다. 내 제안은 여러 파일을 사용하는 경우 많은 파일이있는 경우 수백만 개의 파일이있는 디렉토리를 매우 느리게 탐색 할 수 있다는 것입니다. 가능한 경우 파일을 그룹화하여 별도의 디렉토리에 넣고 "키 입력"할 수 있습니다. 나는 시스템의 모든 사용자 사용자를위한 작은 pdf 문서를 많이 만들어야하는 응용 프로그램이 있습니다. 이것을 하나의 디렉토리에 넣으면 악몽이되지만 사용자 ID마다 디렉토리를 사용하면 관리가 훨씬 쉬워집니다.

3

귀하의 데이터가 1MB라면, 전적으로 메모리에 저장하는 것이 좋습니다.

질문에 대한 단서를 제공하기 위해 하나의 큰 파일을 갖는 것은 응용 프로그램이 행 관리를 수행하고 있음을 의미합니다. 여러 개의 작은 파일을 갖는 것은 시스템과 파일 시스템을 사용하여 데이터를 관리하는 것입니다. 후자는 모든 작업에 대한 시스템 호출을 포함하기 때문에 상당히 느릴 수 있습니다.

1

파일 열기 및 500 개 파일 2킬로바이트 각을 ... 그리고 당신이 처리 할 경우 1000위한 추가적인 작업 응용 프로그램 (500 열기 파일 500 폐회)에 추가 될 것, 즉 C에서 파일을 닫는 것은 많은 시간 걸릴 것이다. .. 1000 추가 작업이 ... (그 ... 순전히 내 개인적인 의견입니다) 디렉토리를 읽기

4

일반적으로 파일을 읽는 것보다 더 비용이 많이 드는 것이 아니라 당신을 절약 할 크기의 1 MB의 1 개 파일을하면서. 그러나 이름 지정 규칙으로 인해 디렉토리를 읽지 않고 원하는 파일을 찾을 수 있다면 (즉, "파일 이름 반복"이 아닌 "파일 이름 구성") 데이터베이스를 분할하는 것이 유리할 수 있습니다.

+0

적절한 파일 이름을 만드는 것은 많은 의미가 있으며 작업하기에 너무 힘들어서는 안됩니다. 매우 감사합니다. – Dan

1

이것은 모두 파일 시스템, 블록 크기 및 메모리 캐시에 따라 다릅니다.

평소와 마찬가지로 premature optimization은 피해야하므로 실제 문제인지 확인하고 확인하십시오. 하나의 파일을 사용하는 것부터 많은 수의 작은 파일을 사용하는 것은 실제 성능에서별로 중요하지 않으며, 그 대신에 선명도와 유지 보수성에 기반해야합니다.

(내가 알고있는 것은 선형 파일 검색에 의존해서는 안되며 O (1) 시간에 파일을 정확하게 찾아내는 명명 규칙을 사용하는 것입니다.)

0

DB를 사용할 수없는 이유는 무엇입니까? 나는 당신의 취향을 존중하지만 그것이 올바른 이유인지 확인하고 싶습니다.

모든 DB에 서버를 연결하거나 복잡한 배치가 필요하지는 않습니다. 예를 들어 SQLite은 응용 프로그램에 쉽게 포함될 수 있습니다. 파이썬에는 이미 내장되어 있으며 C 코드로 연결하기가 매우 쉽습니다 (SQLite 자체는 C로 작성되었으며 기본 API는 C 용입니다). SQLite는 여러 테이블을 생성하고 DB의 다른 모든 유용한 기능을 사용할 수있는 디스크의 단일 파일에서 완전한 기능의 DB를 관리합니다.

관련 문제