2014-07-10 2 views
0

임베디드 응용 프로그램에서 이진 파일을 제한된 메모리로 읽어 들이고 최소 시간 내에 구문 분석해야합니다. 시간을 최소화하면서 포인터를 최소화하는 방법

전체 파일

읽고 메모리가 할당 될 수있다 : 각

대안 4 바이트의 적어도 240 포인터 발생할

char **array = malloc(sizeof(char *) * row); 
for(char c = 0; c < 240; c++){ /*320 x 240 file*/ 
    array[c] = malloc(320); 
} 

: 포인터를 최소화

array = malloc(320*240); 

을 구문 분석 중 각 액세스마다 곱셈이 발생합니다. 하드웨어 곱셈이 없으면 시간이 많이 걸릴 것입니다.

구문 분석을 위해 한 번에 적어도 세 개의 행이 메모리에 필요합니다.

SD 카드에서 읽기가 느리고 한 번에 한 줄씩 읽는다고 확신하지 않으며 파싱은 전체 파일을 한 번에 읽은 다음 구문 분석하는 것보다 느립니다.

이 질문에 대한 대답은 프로세서의 메모리 크기 요구 사항을 결정합니다. 물론, 더 작은 프로세서는 더 싸고, 그것은 큰 요소이지만, 구문 분석 시간은 아마도 더 큰 요소 일 것입니다.

+3

한 번에 3 개의 행만 필요한 경우이 3 개의 행을 할당 할 수는 없습니까? – AntonH

+1

테스트 할 수 없습니까? 프로세서가 없다면 테스트 만 빌릴 수는 없습니까? 실제 하드웨어에서 실제 프로파일 링없이 더 빠를 것이라고 말하는 것은 매우 어렵습니다. – bolov

+0

여하튼 우리는이 프로젝트에서 당신에게 더 중요한 것을 말할 수 없습니다. 속도와 공간 사이에는 항상 균형이 있으며 임베디드를 선택하면 더욱 중요합니다. 결국 계산을 가속화 할 수있는 CPU 관련 기술을 한 번 결정하거나 찾아야합니다. – AntonH

답변

0

사용할 수있는 파일 접근 방법이 무엇인지 모른 채 완전한 권장 사항을 제시하는 것은 어렵지만 fread와 같은 것을 사용하여 한 번에 지정된 크기의 청크를 읽은 다음 계속 사용하는 것이 좋습니다 이미 말한대로 3 버퍼 세트를 채 웁니다. 그래서 같은 것을 :이 파일 스트림은 당신이 자신의 내부 버퍼 내에서 염려되는 등 IO 버퍼링 돌볼 수 있습니다

FILE *fileStream = fopen ("file.bin", "rb"); 
char **array = malloc(sizeof(char *) * 3); 
int i = 0; 
size_t bytesRead = 0; 

while (!feof(fileStream)) 
{ 
    for (i = 0; i < 3; i++) 
    { 
     /* If read has returned some bytes - i.e. not at EOF */ 
     if (fread (&array[i], 1, 320, fileStream)) 
     { 
      /* Assuming target knows size of array. Pass in number in iteration 
      * so target function knows where the read ends */ 
      doProcessing (array, i); 
     } 
    } 
} 

는, 당신은 일품 요리를 읽을 FREAD를 사용할 수 있습니다.

그러나이 말에, 내가 만들고있어 몇 가지 가정 :

  1. 기능 기반 구조가 실제로 바이너리 파일을 소리 귀하의 "행"고이 SD 카드
  2. 액세스 할 수 있습니다 FREAD 당신 다시 파싱하고 사용자가 이 아닌 경우은 각 행 또는 개행 문자로 구분 된 데이터 집합에 채워진 바이트 수를 저장해야합니다.
관련 문제