2012-06-15 4 views
1

바이너리 (파일) 데이터 처리에 어려움을 겪고 있습니다 (C#의 경우). (둘 다 32을 실행하는 2 기가 바이트 램과 느린 노트북을 가정 '충돌하는'바이너리 형식에 대한 빠른 이진 읽기 및 쓰기 문제

  • 내가 메모리에 맞게 1메가바이트만큼 작고 60기가바이트만큼 큰, 따라서 불가능할 수있는 이진 파일이 :이 상황 및 64 비트 창). 이 파일에는 예를 들어 시간 기준으로 20 개의 소스의 데이터가 들어 있습니다. 파일의 헤더는 신호 길이에 대해 알려주지 않으므로 각 신호의 길이가 다를 수 있습니다 (그리고 대부분의 wime이 다를 수 있음). 따라서 하나의 신호가 포핸드에 들어있는 바이트 수를 알지 못합니다. 또한 데이터가 파일에 따라 불규칙적으로 배치되어 있습니다. 따라서 해당 신호 샘플과 일치하는 파일에서 식별자 (2 바이트)를 검색해야합니다.

  • 두 번째로이 데이터를 처리하여 새로운 바이너리 파일에 저장해야합니다. 파일 크기는 대략 동일합니다. 그러나 이진 형식은 완전히 다릅니다. 사실 그것은 Matlab 바이너리 파일 형식입니다. matlab에 바이너리 내가 포핸드의 길이를 알 필요가 신호의 헤더 (바이트 수로 주어) 신호 길이를 필요로하기 때문에

    • :

    은 도전이다. 또는 마지막에 서면 바이너리를 찾아 길이를 저장하십시오.
  • 성능이 정말 좋을 필요가 있습니다. 대상이 하드 디스크의 r/w 속도에 근접하고 있으므로 CPU 시간이 짧아야합니다.
  • 데이터가 내부 메모리에 맞지 않으므로 정렬 블록 현명한 처리가 필요합니다. 하지만 성능을 희생하지 않으면 서 메모리 오버 플로우 예외가 발생하지 않도록 블록 크기를 올바르게 제한하는 방법은 무엇입니까?

이미 파일의 메모리 매핑을 읽으려고했지만 신호의 길이를 알기 위해 전체 파일을 검색해야하므로이 문제에 봉착했습니다.

위의 작업을 수행하는 좋은 방법은 무엇입니까?

+0

바이너리 파일에 저장할 수 있도록 신호 길이를 결정해야합니다. 너는 넓다. 신호 강도를 결정할 수 있습니까? 결정할 수 없다면이 질문을 할 수 있습니다. 현재 읽고 쓰고있는 코드 (16 진수)를 포함하여 현재 사용하고있는 코드를 게시하십시오. 형식과 모든 필드를 설명하여 도움을 받으십시오. 내 관점에서 당신이 걱정해야 할 유일한 성능 매트릭스는 하드 디스크 자체에 완전히 의존하는 새 파일을 얼마나 빨리 작성할 수 있는지입니다. 따라서 문제를 "해결"할 수 있습니다. –

+0

Ramhound와 usr에게 감사드립니다. 신호의 길이를 잘 판단하는 것이 문제의 큰 부분입니다. 이 방법은 메모리에있는 동적 배열 (리스트)에 신호를로드하거나 식별자와 해당 신호를 찾는 바이너리 파일 (예 : 60GB)을 검색해야하므로 각 신호마다 바이트 길이를 누적해야합니다. 신호)를 읽은 다음 데이터 읽기 및 쓰기를 시작합니다. 이것은 파일의 모든 바이트가 적어도 2 번 읽혀지기 때문에 시간이 걸립니다. 아니면 누군가가 이것을 빨리 할 수있는 방법을 알고 있습니까? – wlamers

답변

1

전체 입력 파일을 순차적으로 스캔합니다. 파일을 통과 할 때마다 메모리가 보유 할 수있는만큼 많은 "신호"를 메모리에 수집합니다. 작업 메모리 버퍼가 가득 차면 수집 된 "신호"를 출력 Matlab 파일에 쓰고 다음 단계로 더 많은 신호를 수집하기 위해 다시 시작합니다. 새로운 신호가 발견되지 않으면 알고리즘이 종료됩니다.

이 알고리즘은 큰 파일의 경우 데이터를 여러 번 통과해야하지만 적어도 순차적 IO는 다소 빠릅니다.

0

신호 분배기는 어떻습니까? 파일을 한 번 검사하고 각각의 새 신호에 대해 새 파일을 만듭니다. 거대한 파일을 읽는 동안 데이터를 올바른 신호 파일에 기록합니다. 메모리는 아무런 문제가 아닙니다. 디스크에서 하나의 청크 (약 4KB) 만 읽으므로 메모리 경계가 가까워지지 않기 때문입니다.

신호 사이에 상관 관계가 필요하면 시간 기반 마커를 분할 파일에 삽입하여 시간 기반 분석이 필요합니다. 그것은 또한하기 쉽습니다.

추가 보너스로 파일 길이를 읽음으로써 신호 길이를 알 수 있습니다. 또는 시간 기반의 작업을 할 경우 분할 과정에서 발견 된 최종 신호 길이의 헤더를 작성합니다.

+0

감사합니다 Alois,하지만 작성된 파일을 분할과 prolbem은 Matlab에 데이터를로드하는 더 diffucult 가져옵니다. Matlab 구조를 가진 파일이 선호됩니다. 내가 지금하고있는 일은 파일을 두 번 읽는 것입니다. 첫 번째 시도는 메모리 주소와 신호 길이를 얻는 것입니다. 파일을 쓰는 두 번째 것. 그러나 다시 주소를 저장하는 문제는 그에 필요한 메모리가 또한 크다는 것입니다. – wlamers