파일의 시작 부분에서 끝에서만 알고있는 것을 쓰는 것


9

배경 : EBML 파일을 작성하기 위해 마이크로 컨트롤러 C 코드를 작성하고 있습니다. EBML은 중첩 된 요소가있는 이진 XML과 유사하지만 시작 및 끝 태그 대신 시작 ID, 길이 및 데이터가 있습니다. 저전력 응용 프로그램에서 외부 플래시에 이것을 쓰고 있으므로 플래시 액세스를 최소로 유지하고 싶습니다. 쉬운 일이 없기 때문에 메모리도 제한됩니다.

전체 EBML 요소를 메모리에 보관할 수 있으면 해당 길이가 무엇인지 알고 난 후 각 요소의 길이를 다시 채울 수 있으므로 생성이 쉽습니다. 문제는 전체 요소를 메모리에 담을 수 없을 때해야 할 일입니다. 내가 볼 수있는 옵션은 다음과 같습니다.

  • 내가 아는 내용을 작성한 다음 돌아가서 길이를 추가하십시오 (가장 쉬우지만 원하는 것보다 더 많은 플래시 액세스를 추가합니다)
  • 쓰기를 시작하기 전에 각 요소의 길이를 계산하십시오 (상대적으로 쉽지만 많은 프로세서 시간)
  • 메모리가 가득 차면 모드를 전환하여 데이터를 계속 진행하지만 메모리에 이미 예약 된 요소의 길이 만 계산합니다. 그런 다음 내가 가진 것을 메모리에 쓰고 돌아가서 중단 한 곳에서 데이터를 계속 처리하십시오. (지금까지 내가 좋아하는 옵션)
  • 요소를 작성해야하고 최종 길이를 아직 알 수없는 경우 최대 또는 최악의 경우 길이를 지정하십시오. (위보다 쉽지만 역화 및 공간 낭비 가능)

질문 : 사람들이 생각한 비교적 일반적인 문제인 것 같습니다. 일부 데이터 패킷을 형성 할 때도 발생할 수 있다는 것을 알고 있습니다. 여기서 누락 된 더 나은 / 더 일반적인 / 더 많은 인정 된 기술이 있습니까? 아니면 내가 검색 할 수있는 문제에 대한 용어가 있습니까?


1
/ sccs 는 다음과 같이 작동합니다. 쓰기가 끝나면 파일의 시작 부분에 모든 바이트의 체크섬을 씁니다. 원자 적으로 필요한 파일 작업 (예 : Solaris)을 수행 할 수있는 Unix에서 잘 작동하며이를 수행 할 수없는 Unix에서 이상한 산발적 문제가 발생합니다 (예 : Linux
gnat

답변:


2

페이로드의 길이를 모르는 경우 나중에 위치를 기억하고 길이를 다시 채울 수 없어도 걱정할 필요가 없습니다.

"알 수없는 크기"를 적어 두십시오.

이 기능은 EBML 요소로 구성된 페이로드와 다음 하위 요소가 유효한 하위 요소가 아닌지에 따라 다릅니다.

원하는 경우 나중에 원하는 방식으로 예를 들어 "알 수없는 크기, 최소 크기"또는 "최소 크기, 알 수없는 크기 방지"와 같이 원하는 EBML을 오프라인으로 정규화 할 수 있습니다.


자세한 내용은 matroska.orgEBML RFC 초안 을 참조하십시오.


대단해! 그것은 내가 알지 못했고 핵심 문제를 피하지만 여전히 핵심 문제를 해결하는 좋은 방법에 대한 지침을 원합니다. 알 수없는 크기의 요소를 사용하면 오래된 소프트웨어가 새 요소를 조기에 종료하므로 향후 호환성을 제한 할 수있는 것 같습니다.
pscheidler

올바른 DTD가 필요하거나 EBML을 실제로 디코딩 할 수 없습니다. 알 수없는 모든 요소의 크기가 조정되면 건너 뛸 수 있지만 충분합니까? 오프라인으로 저장하려는 모든 EBML을 사후 처리하면됩니다.
중복 제거기

우리는 확장 할 자체 스키마를 사용하고 있습니다. 이전 소프트웨어는 결국 일부 데이터를 건너 뛰어야한다는 사실을 알고 설계되었습니다. 그러나 이것은 내가 몰랐던 EBML의 훌륭한 기능이므로 대답을 받아들입니다.
pscheidler

0

고정 된 수의 하위 요소가있는 단일 요소가 너무 큰 경우이를 스키마로 분할해야합니다. 이 형식을 모르지만 대부분의 경우 최대 길이를 정의 할 수 있습니다.

시퀀스의 경우 하위 파일의 최대 개수와 다음 파일에 남아있는 "스트림"을 정의하려고 할 수 있습니다.

잠재적으로 최대 메모리 크기를 초과하는 요소의 경우 예약 요소 길이 위치 및 길이 카운터 쌍을 포함하는 스택을 준비하십시오. 팝에서 현재 마커에 현재 카운터를 저장하고 다음 카운터에 값을 추가하십시오.

일반적으로 너무 큰 요소의 수를 최소화하려고 시도하십시오.


글쎄, 그는 아마도 자신의 EBML 요소를 위해 그것을 할 수는 있지만 여전히 부모 요소를 사용하는 데 도움이되지 않습니다.
중복 제거기

귀하의 아이디어는 효과가 있지만 스키마를 제한하여 큰 요소를 피하는 대신 큰 요소를 처리 할 수있는 시스템을 만들고 싶습니다.
pscheidler

이 솔루션은 큰 요소에도 적용되며 스택 크기에주의하십시오. 그리고 스키마에 관해서는 ... 응용 프로그램이 사용하는 언어로 생각하십시오. 복잡한 언어를 처리 할 수 ​​없다면 다른 언어를 조정해야하거나 번역기가 필요합니다. 많은 개발자 (적어도 내가 아는 C / C ++ 개발자)는 스키마 / 디자인 변경을 피하는 경향이 있습니다. 나중에 화재로 인해 시스템 성능이 저하됩니다. 다른 구성 요소를 조정할 수 없으면 분해 / 설계가 제대로되지 않은 것입니다. 변경하지 않는 다른 이유가 있다면 다른 하드웨어의 사용을 고려해야합니다
Whoot

0

키스와 야니.
옵션 # 1을 선택하고 실제 문제가되는 경우에만 반복하십시오.

최소한 이진 형식이 유사한 유사한 사용 사례의 경우 몇 가지 값만 이러한 방식으로 채워야 할 때 가장 단순하고 쉬운 솔루션입니다. 모든 데이터 청크에서이 작업을 수행해야하는 경우 아키텍처에 결함이있을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.