문제

이전에 나는 물었다 의문.

문제는 파일 구조의 요구가 매우 높다는 것입니다.

예를 들어, 최대 4500 파일과 500MB 데이터가있는 컨테이너를 만들려고합니다.

이 컨테이너의 파일 구조는 구성됩니다

  • sqlite db (1MB 미만)
  • 텍스트 기반 XML 유사 파일
  • 4,500 파일의 나머지 부분을 구성하는 동적 폴더 구조 내부의 이미지

  • 초기 생성 후 이미지 파일은 삭제를 제외하고 만 읽습니다.

  • 작은 DB는 컨테이너에 액세스 할 때 정기적으로 사용됩니다.

타르, 지퍼 및 좋아요는 너무 느립니다 (압축 0). 느린 주관적이지만,이 크기의 컨테이너는 20 초 이상입니다.

이견있는 사람?

도움이 되었습니까?

해결책

세개.

1) Timothy Walters가 말한 것은 옳은 일입니다. 더 자세히 설명하겠습니다.

2) 4500 파일과 500MB의 데이터는 단순히 많은 데이터와 디스크가 쓰기입니다. 전체 데이터 세트에서 작동하는 경우 속도가 느립니다. 그냥 I/O 진실.

3) 다른 사람들이 언급했듯이, 사용 사례에 대한 세부 사항은 없습니다.

우리가 읽기 전용, 무작위 액세스 시나리오를 가정하면, Timothy의 말은 거의 죽었고 구현은 간단합니다.

간단히 말해서, 여기에 당신이하는 일이 있습니다.

모든 파일을 단일 덩어리로 연결합니다. 당신이 그것들을 연결하는 동안, 당신은 파일이 블로브 내에서 시작되는 파일 이름, 파일 길이 및 오프셋을 추적합니다. 해당 정보를 이름별로 정렬 한 데이터 블록에 작성합니다. 이것을 목차 또는 TOC 블록이라고합니다.

다음으로 두 파일을 함께 연결합니다. 간단한 경우에는 먼저 TOC 블록이 있고 데이터 블록이 있습니다.

이 형식에서 데이터를 얻으려면 파일 이름에 대한 TOC를 검색하고 데이터 블록의 시작부터 오프셋을 잡고 TOC 블록 크기를 추가 한 다음 파일 _length 바이트를 읽습니다. 단순한.

영리하고 싶다면 Blob 파일 끝에 TOC를 넣을 수 있습니다. 그런 다음 결국 TOC의 시작으로의 오프셋을 끝내십시오. 그런 다음 파일의 끝으로 4 개 또는 8 바이트를 백업하고 (숫자 크기에 따라) 해당 값을 가져 와서 TOC의 시작으로 더 멀리 돌아갑니다. 그런 다음 정사각형으로 돌아 왔습니다. 처음에 아카이브를 두 번 재건 할 필요가 없도록이 작업을 수행합니다.

TOC를 블록 (예 : 1K 바이트 크기)으로 배치하면 TOC에서 이진 검색을 쉽게 수행 할 수 있습니다. 파일 정보 항목으로 각 블록을 채우고 공간이 부족할 때 마커를 쓰고 제로가있는 패드를 작성하고 다음 블록으로 전진하십시오. 이진 검색을 수행하려면 이미 TOC의 크기를 알고 중간에서 시작하여 첫 번째 파일 이름을 읽고 거기에서 이동하십시오. 곧 블록을 찾은 다음 블록을 읽고 파일을 스캔합니다. 이것은 전체 TOC를 RAM에 넣지 않고도 읽기에 효율적입니다. 또 다른 이점은 차단이 타르와 같은 체인 체계보다 디스크 활동이 적다는 것입니다 (아카이브를 기어 다니기 위해 아카이브를 기어 다니면서).

파일을 블록 크기로 패드하는 것이 좋습니다. 일반 크기의 데이터 블록으로 작업하는 디스크는 어렵지 않습니다.

재건하지 않고 이것을 업데이트하는 것은 어렵습니다. 업데이트 가능한 컨테이너 시스템을 원한다면이 경우에 실제로 찾고있는 것이기 때문에 더 간단한 파일 시스템 설계를 살펴볼 수도 있습니다.

이식성은 대부분의 표준 라이브러리에 해당 세부 사항을 처리 할 수있는 루틴이 있으므로 이진 번호를 네트워크 순서로 저장하는 것이 좋습니다.

다른 팁

컨테이너에서 임의의 파일 시스템 작업을 수행하는 것처럼 (예 : 생성, 컨테이너에서 새 파일 삭제, 기존 파일을 덮어 쓰고, 추가), 어떤 종류의 파일 시스템으로 가야한다고 생각합니다. 큰 파일을 할당 한 다음 파일 시스템 구조를 만듭니다.

사용 가능한 파일 시스템에는 몇 가지 옵션이 있습니다. Berkeley UFS 및 Linux Ext2/Ext3의 경우 사용 가능한 사용자 모드 라이브러리가 있습니다. 어딘가에 지방 구현을 찾을 수도 있습니다. 파일 시스템의 구조를 이해하고 확장 할 수있는 파일 시스템을 선택하십시오. Ext2는 (다른 블록 그룹에 의해) 확장하기 쉽고 지방을 확장하기가 어렵다는 것을 알고 있습니다 (지방에 추가해야 함).

또는 파일 시스템 아래에 가상 디스크 형식을 넣을 수 있으므로 블록을 임의의 리핑 할 수 있습니다. 그런 다음 파일 시스템의 "무료"블록은 디스크에 나타날 필요가 없으며 실제 컨테이너 파일보다 훨씬 큰 가상 디스크를 할당 할 수 있습니다.

파일에 대한 읽기 전용 액세스가 필요하다는 가정에서 작업하면 파일 이름을 알려주고 파일 이름을 알려주는 두 번째 "색인"파일 (또는 헤더의 인덱스)이있는 이유 위치와 길이. 당신이해야 할 일은 시작점을 찾아 올바른 바이트 수를 읽는 것입니다. 이 방법은 귀하의 언어에 따라 다르지만 대부분의 언어에서는 매우 간단합니다.

그런 다음 가장 어려운 부분은 데이터 파일 + 색인을 생성하게됩니다. 심지어는 매우 기본입니다!

ISO 디스크 이미지가 트릭을 수행 할 수 있습니다. 많은 파일을 쉽게 보관할 수 있어야하며 모든 주요 운영 체제에서 많은 소프트웨어에서 지원됩니다.

먼저, 질문을 확장 해 주셔서 감사합니다. 더 나은 답변을 제공하는 데 많은 도움이됩니다.

어쨌든 SQLITE 데이터베이스가 필요하다는 점을 감안할 때 데이터베이스에 모든 것을 넣는 성능을 살펴 보셨습니까? 내 경험은 SQL Server 2000/2005/2008을 기반으로하므로 SQLITE의 기능은 긍정적이지 않지만 레코드를 찾고 데이터를 얻는 데있어 매우 빠른 옵션이 될 것이라고 확신합니다. 및/또는 업데이트 옵션.

일반적으로 데이터베이스 내부에 파일을 넣는 것이 좋지 않지만 모든 이미지의 총 크기는 이미지 당 100k 이상으로보고있는 4500 개의 이미지의 경우 약 500MB이라는 점을 감안할 때? 동적 경로를 사용하여 이미지를 저장 한 경우 약간 더 정규화 된 데이터베이스에서 각 경로를 ID에 매핑하는 "ImagePaths"테이블을 가질 수 있습니다. 그러면 해당 PathID로 이미지를 찾아서 데이터를로드 할 수 있습니다. 필요에 따라 Blob 열.

XML 파일은 SQLITE 데이터베이스에있을 수 있으며, 이는 문제없이 Windows와 OSX 사이를 이동할 수있는 앱의 단일 '데이터 파일'을 제공합니다. SQLITE 엔진에 의존하여 필요한 성능과 호환성을 제공 할 수 있습니다.

예를 들어 특정 경로에서 모든 이미지를 가져와야하는 경우 자주 필요한 경우 (성능을위한 정수로서) PathID가 빠르지 만 시작하는 모든 이미지를 보여주는 경우에는 사용량에 따라 다릅니다. "A"를 사용하면 경로를 속성으로 표시하면 ImageName 열의 인덱스가 더 많이 사용됩니다.

나는 '빠르게'작동하는 솔루션을 찾아야하기 때문에 조기 최적화처럼 들리지만 애플리케이션 (또는 Mac 및 PC 버전이 모두있는 경우 두 앱)을 사용하여 사용하는 솔루션을 찾아야하기 때문에 조기 최적화와 같은 소리가 조금 걱정됩니다. 간단한 저장소 또는 이와 유사한 후 응용 프로그램에 영향을 미치지 않고도 스토리지/검색 메소드를 변경할 수 있습니다.

확인하다 솔리드 파일 시스템 - 필요한 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top