문제

나는 시뮬레이션을 읽는 큰 데이터는 바이너리 파일을 만들(10s100GB).우리가 사용하는 이진 속도를위한 이유입니다.이러한 파일 시스템에 따라 달라집,변환 텍스트 파일에서 각 시스템에 우리는 실행,그래서 나는에 대해 우려하지 않습니다.파일이 현재 있는 많은 경우의 포드 구조체로 작성 fwrite.

나를 변경해야 하는 구조체,그래서 내가 원하를 추가하는 헤더가 있는 파일 버전 번호는 증가 될 것이 언제나의 구조체의 변경합니다.이후 나는 이를 추가하려면 몇 가지 다른 정보뿐만 아니라.나는 생각하고 크기의 구조체,byte 기 위해,그리고 어쩌면 svn 버전 번호의 코드는 바이너리 파일입니다.거기에 아무것도 다른 것에 유용한 추가?

도움이 되었습니까?

해결책

내 경험상, 필요한 데이터를 두 번째로 추측하는 것은 항상 낭비되는 시간입니다. 중요한 것은 당신을 구성하는 것입니다 메타 데이터 확장 가능한 방식으로. XML 파일의 경우 간단하지만 이진 파일에는 조금 더 생각이 필요합니다.

시작이 아니라 파일 끝에 메타 데이터를 구조에 저장하는 경향이 있습니다. 여기에는 두 가지 장점이 있습니다.

  • 잘림/없는 파일이 쉽게 감지됩니다.
  • 메타 데이터 바닥 글은 종종 읽기 코드에 영향을 미치지 않고 기존 파일에 추가 될 수 있습니다.

내가 사용하는 가장 간단한 메타 데이터 바닥 글은 다음과 같이 보입니다.

struct MetadataFooter{
  char[40] creatorVersion;
  char[40] creatorApplication;
  .. or whatever
} 

struct FileFooter
{
  int64 metadataFooterSize;  // = sizeof(MetadataFooter)
  char[10] magicString;   // a unique identifier for the format: maybe "MYFILEFMT"
};

원시 데이터 후에 메타 데이터 바닥 글과 파일 바닥 글이 작성됩니다.

파일을 읽을 때 종말 -SizeOf (FileFooter)를 찾으십시오. 바닥 글을 읽고 Magicstring을 확인하십시오. 그런 다음 metadatafootersize에 따라 다시 찾아 메타 데이터를 읽으십시오. 파일에 포함 된 바닥 글 크기에 따라 누락 된 필드에 기본값을 사용할 수 있습니다.

처럼 Keithb 지적하면,이 기술을 사용하여 메타 데이터를 XML 문자열로 저장하여 이진 데이터의 작품과 속도와 함께 완전히 확장 가능한 메타 데이터의 장점을 제공 할 수도 있습니다.

다른 팁

큰 바이너리의 경우 HDF5 (Google)를 진지하게 살펴 봅니다. 그것이 당신이 채택하고 싶은 것이 아니더라도 자신의 형식을 디자인하는 데 유용한 방향을 가리킬 수 있습니다.

큰 바이너리의 경우, 버전 번호 외에도 레코드 카운트와 CRC를 넣는 경향이 있습니다. 큰 바이너리가 시간이 지남에 따라 또는 작은 것보다 전송 중에 잘 자르거나 손상되기 쉽기 때문입니다. 나는 최근에 Explorer를 사용하여 2 백 개의 파일을 가로 질러 약 2TB를 복사하여 첨부 된 NAS 장치에 약 2TB를 복사하고 각 사본에서 2-3 개의 파일을 발견했기 때문에 최근에 Windows 가이 문제를 잘 처리하지 못한다는 것을 알았습니다. 복사).

나중에 바이너리 파일에 다른 구조를 작성하는 경우 파일 유형에 대한 식별자가 유용합니다. 어쩌면 이것은 짧은 문자열 일 수 있으므로 (Hex Editor를 통해) 포함 된 내용을 살펴보면 볼 수 있습니다.

만약 그들이는 큰 나는 예약 건강한 덩어리(64K?) 의 공간의 시작 부분에 파일을 넣어 메타데이터가 있는 XML 형식으로 다음에 파일의 끝자(Ctrl-Z for DOS/Windows,ctrl-D unix?).할 수있는 방법을 검사하고 분석하는 메타데이터에 쉽게와 함께 광범위한 도구 집 밖에 대한 XML.

그렇지 않으면 나와 함께 가 다른 어떤 사람들이 이미 말했:타임 스탬프를 위한 파일 생성한 식별자는 기계 그것의 생성에 기본적으로 아무거나 다른 사람의 생각할 수 있는 진단을 위한 목적입니다.이상적으로 포함할 정 구조물의 형식이다.변경하는 경우 자주 구조,그것은 큰 고통을 유지하는 적절한 버전의 코드를 읽을 다양한 형식의 데이터 파일.

의 큰 장점 중 하나는 HDF5 로@highpercomp 언급했고,되지 않는다는 점을 알게 되었습니다 걱정할 필요가 변경 사항에 대한 구조 형식을 만큼 당신이 어떤 규칙의 이름이 무엇과 데이터 형식이 있다.구조 이름과 데이터 형식 모두 파일에 저장된 자체,그래서 날려버릴 수 있습 C 코드에 산산조각하고 그것은 중요하지 않습니다,당신은 여전히 데이터를 검색 HDF5 파일입니다.그것은 당신에 대한 걱정을 덜 형식 의 데이터에 대한 자세 구조 의 데이터나는에 대해 걱정하지 않은 시퀀스의 바이트는 HDF5 의 문제요,하지만 걱정 필드에 이름과 같습니다.

또 다른 이유는 다음과 같 HDF5 은 당신이 선택할 수 있을 사용하여 압축,는 아주 적은 양의 시간과를 줄 수 있을 거대한 승리에 저장 공간을 데이터 천천히 변화하거나 주로 동을 제외하고 몇 가지 잘못된 글의 흥미도.

@rstevens는 '파일 유형에 대한 식별자'라고 말했습니다. 일반적으로이를 마법 번호라고하며 파일에서는 남용의 용어가 아닙니다 (코드와는 달리 학대 용어). 기본적으로, 그것은 약간의 숫자 - 일반적으로 4 바이트이며, 일반적으로 해당 바이트 중 하나 이상이 ASCII가 아닌지 확인합니다. 파일이 혼동 될 확률이 낮은 유형인지 확인하는 데 사용할 수 있습니다. . 또한 /etc /magic (또는 로컬 동등한)에 규칙을 작성하여 마법 번호가 포함 된 파일이 특별한 파일 유형이라고보고 할 수 있습니다.

파일 형식 버전 번호를 포함해야합니다. 그러나 코드의 SVN 수를 사용하지 않는 것이 좋습니다. 파일 형식이 없을 때 코드가 변경 될 수 있습니다.

스키마 버전 작성에 필요한 정보 외에도 문제를 해결하는 경우 가치가있는 세부 정보를 추가하십시오. 예를 들어:

  • 파일이 생성되고 업데이트 된 시점의 타임 스탬프 (해당되는 경우).
  • 빌드의 버전 문자열 (이상적으로는 모든 '공식'빌드에 자동 증가 된 버전 문자열이 있습니다. 파일 스키마 버전과 다릅니다).
  • 파일 생성 시스템의 이름 및 앱과 관련된 기타 통계

우리는 이것이 매우 유용하다는 것을 알게됩니다 (a) 정보를 얻는 데있어 고객에게 제공 해야하는 정보를 얻고 (b) 올바른 정보를 얻으려면 - 다른 버전의 소프트웨어를 실행하고 있다고보고하는 것은 놀랍습니다. 데이터 청구!

헤더의 고정 위치에 파일 오프셋을 고정하는 것을 고려할 수 있습니다. 이는 파일의 실제 데이터가 어디에서 시작되는지 알려줍니다. 따라서 필요할 때 헤더 크기를 변경할 수 있습니다.

두 가지 경우, 값 0x12345678을 헤더에 넣어 파일 형식이 처리하는 기계의 엔디 니즘과 일치하는지 감지 할 수 있습니다.

통신 장비 구성 및 펌웨어 업그레이드에 대한 경험에 따르면 버전 (헤더의 고정 부분)에서 시작하는 시작시 (중요하다) 처음에는 몇 가지 사전 정의 된 바이트 만 있으면됩니다. 나머지 헤더는 선택 사항입니다. 적절한 버전을 표시하여 항상 처리 방법을 보여줄 수 있습니다. 여기서 중요한 것은 파일 끝에 헤더의 '가변'부분을 배치하는 것이 좋습니다. 파일 컨텐츠 자체를 수정하지 않고 헤더에서 작업을 계획하는 경우 또한 이는 가변 헤더 부분을 다시 계산 해야하는 '부록'작업을 단순화합니다.

고정 크기 헤더에 대한 기능이있어서 좋습니다 (처음에) :

  • 공통 '길이'필드 (헤더 포함).
  • CRC32 (헤더 포함)와 같은 것.

자, 가변 부품 XML 또는 헤더의 꽤 확장 가능한 형식의 경우 좋은 아이디어이지만 실제로 필요합니까? 나는 ASN 인코딩에 대한 많은 경험을 가졌다. 대부분의 경우 그 사용법은 오버 샷이었다.

글쎄, 아마도 당신은 당신이 다음에 설명 된 TPKT 형식과 같은 것을 볼 때 추가적인 이해를 가질 것입니다. RFC 2126 (4.3 장).

헤더에 버전 번호를 넣는 경우 포드 구조물을 변경하거나 헤더에 새 필드를 추가해야 할 때마다 해당 버전을 변경할 수 있습니다.

따라서 흥미로울 수 있기 때문에 헤더에 물건을 추가하지 마십시오. 당신은 당신이 유지 해야하는 코드를 만들고 있지만 실제 가치는 거의 없습니다.

큰 파일의 경우 데이터 정의를 추가하여 파일 형식이 자체 설명이됩니다.

내 변형은 Roddy와 Jason S의 접근 방식을 결합합니다.

요약 - 다른 곳에 저장된 길이를 결정하는 방법으로 파일 끝에 형식의 텍스트 메타 데이터를 넣으십시오.

1) 파일의 시작 부분에 길이 필드를 넣어 고정 된 길이를 가정하지 않고 끝에 메타 데이터의 길이를 알 수 있습니다. 이렇게하면 메타 데이터를 얻으려면 고정 길이의 초기 필드를 읽은 다음 파일 끝에서 메타 데이터 블로브를 가져옵니다.

2) 메타 데이터에는 XML 또는 YAML 또는 JSON을 사용하십시오. 파일을 읽는 사람이 XML로 시작하기 때문에 파일을 자동으로 XML이라고 생각하지 않기 때문에 메타 데이터가 끝날 때 메타 데이터가 추가되면 특히 유용하고 안전합니다.

이 접근법의 유일한 단점은 메타 데이터가 자라면 파일의 헤드와 꼬리를 모두 업데이트해야하지만 다른 부분이 어쨌든 업데이트되었을 가능성이 높습니다. 마지막 액세스 날짜처럼 퀴즈를 업데이트하는 경우 메타 데이터 길이가 변경되지 않으므로 업데이트 만 있으면됩니다.

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