2014-11-15 3 views
0

Linux의 SDCARD에 2000,000 이상의 파일을 쓰는 방법.Linux의 SDCARD에 2000,000 이상의 파일을 쓰는 방법

저는 Fedora 9에서 프로그램을 개발 중입니다.이 프로그램은 2000,000 개의 파일 수를 SDCARD에 씁니다. 다음은이 프로그램 코드입니다.

int vnCount = 0; 
int vnDirCount = 0; 
int vnSubDirCount = 0; 
int vnTotalCounts = 3600; 
int vnTotalSubDirs = 8; 
int vnTotalDirs = 1; 

int vnWriteNum; 
char vstrTmp[256]; 
memset(&vstrTmp[0], 0x00, sizeof(vstrTmp)); 

FILE *pfd; 
while (vnDirCount < vnTotalDirs) { 

    memset(&vDstDirName[0], 0x00, sizeof(vDstDirName)); 

    sprintf(&vDstDirName[0], "/media/SD/log/%08d", vnDirCount); 
    printf("<<< output dir: %s\n", &vDstDirName[0]); 
    if(mkdir(vDstDirName, 0x644) < 0) { 

     printf(">>> output dir: error 0 : %s\n", vDstDirName); 
     return -1; 
    } 

    usleep(1000*10); 

    vnSubDirCount = 0; 
    while(vnSubDirCount < vnTotalSubDirs) { 

     memset(&vSubDirName[0], 0x00, sizeof(vSubDirName)); 

     sprintf(&vSubDirName[0], "%s/%02d", &vDstDirName[0], vnSubDirCount); 
     printf("??? output dir: %s\n", &vSubDirName[0]); 

     if(mkdir(vSubDirName, 0x777) < 0) { 
      printf("/// output dir: error : %s\n", vSubDirName); 
      return -1; 
     } 

     vnCount = 0; 
     while(vnCount < vnTotalCounts) { 
      memset(&vstrTmp[0], 0x00, sizeof(vstrTmp)); 
      sprintf(&vstrTmp[0], "%s/%08d%06d.dat", &vSubDirName[0], vnCount); 

      printf("*** output file: %s\n", &vstrTmp[0]); 

      if ((pfd = fopen(&vstrTmp[0], "w")) == NULL) 
      { 
       printf(" @@@ Cannot open output file \n"); 
       return 1; 
      } 

      memset(&buf[0], 0xaa, sizeof(buf)); 
      printf("output file:1 \n"); 

      vnWriteNum = fwrite(&buf[0], sizeof(buf), 1, pfd); 

      //ret = write(pfd, &buf[0], sizeof(buf)); 

      printf("output file:2 \n"); 
      if (vnWriteNum != 1) { 
       fclose(pfd); 
       printf(" $$$ Cannot write output file \n"); 
       return 1; 
      } 


      if (fflush(pfd) != 0) { 
       printf(" ^^^ Cannot flush output file \n"); 
      } 

      if (fsync(fileno(pfd)) != 0) { 
       printf(" ^^^ Cannot flush output file \n"); 
      } 


      printf("output file:3 \n"); 

      if (fclose(pfd) != 0) { 
       printf(" ### Cannot close output file \n"); 
      } 

      usleep(1000*1); 

      vnCount = vnCount +1; 
     } 

     vnSubDirCount = vnSubDirCount + 1; 
    } 

    vnDirCount = vnDirCount + 1; 
} 

프로그램은 2000000 개의 파일 수까지 쓰기가 성공한 것입니다. 그러나 Linux konqueror의 SDCARD에서 23,000 개 이상의 파일을 볼 수 없습니다. 23000 개의 파일 만 볼 수 있습니다. konsole이 너무 큽니다. 그래서 "fsck.vfat"linux 명령으로 SDCARD를 확인합니다. 다음은 명령 결과입니다.

fsck.vfat /dev/sdd1 
dosfsck 2.11, 12 Mar 2005, FAT32, LFN 
Orphaned long file name part "00000000000746.dat" 
1: Delete. 
2: Leave it. 
? 1 
Reclaimed 7658 unused clusters (31367168 bytes). 
Free cluster summary wrong (479444 vs. really 487102) 
1) Correct 
2) Don't correct 

SD 카드의 파일 개수는 23000 개가 넘습니다.

각 파일의 크기는 3.5K입니다. SDCARD의 용량은 2G입니다. 이 SDCARD는 Windows의 FAT32 (할당 단위 4K) 형식입니다. 리눅스 시스템은 Fedora 9입니다. 아무도 도와 줄 수 있습니까? 감사합니다. .

답변

0

파일 시스템이 거대한 디렉토리와 많은 파일에는 적합하지 않으므로 (내가 원하는대로 할 수 없다고 생각합니다). 그리고 SDCARD flash 하드웨어 dislikes 쓰기가 아주 많습니다!

다른 접근 방식을 고려해 볼 수 있습니다. Sqlite 또는 GDBM; 적어도 하나의 단일 파일을 쓸 것입니다.

Sqlite는 FAT 파일과 같은 원시 파일 시스템이라 할지라도 모든 파일 시스템에서 사용할 수 있습니다. 하나의 파일 (그리고 다른 하나는 저널)만을 사용합니다. Sqlite는 본질적으로 라이브러리이며 하나의 단일 파일에 저장된 데이터베이스에 SQL 기능을 제공합니다. 그리고 GDBM (하나 또는 두 개의 파일을 사용)과 마찬가지로. 물론 파일 시스템은 파일의 최대 크기를 제한 할 수 있습니다 (FAT32의 경우 4Gb). sqlite tutorial, sqlite documentations, GDBM manual을 읽으십시오.

SDCARD에서 다른 파일 시스템을 사용할 수도 있습니다 (예 : ext3 또는 또는 btrfs, 주로 Linux에서 읽음).

도 참조 this & that 답.

+0

감사 실레. 나는이 문제가 리눅스 커널의 취약점이나 FAT인지 모른다. 나 한테 대답 해? – bugLucky

+0

FAT의 약점입니다 (처음에는 1 메가 바이트 플로피 용으로 설계되었습니다). –

+0

감사합니다. Sqlite를 FAT32에서 실행할 수 있습니까? 내 프로그램은 FAT32 파일 시스템 만 사용합니다. 내 프로그램은 임베디드 리눅스 프로그램이다. 이 프로그램은 임베디드 장치에서 실행됩니다. 이 장치는 FAT32 SDCARD 만 사용합니다. 그래서 FAT32를 사용해야합니다. 나는 Sqlite가 안드로이드 데이터베이스 엔진이라는 것을 알고있다. Sqlite는 Ext2/3/4 파일 시스템에서만 실행됩니다. 아마 내 생각이 틀렸다. 뭐라 구요. 너 나 가르쳐 줄 수있어? – bugLucky

1

다른 파일 시스템을 사용할 수도 있습니다. fdisk 나 gparted를 사용하면 당파를 조작 할 수 있습니다. 어쩌면 ext4 나 다른 것보다 더 높은 한계가 있습니다.

하지만 일반적으로 다른 대답은 옳습니다. 그렇게하지 말고 더 나은 해결책을 찾아야합니다. 많은 파일을 사용하면 속도가 느려지고 처리되지 않을 수 있습니다. 한 파일에 모두 저장할 수 없습니까?

1

FAT32 파일 시스템은 몇 가지 한계가있다, 하나는 파일의 최대 수에 관한 것입니다 : 268,173,300 (2^28ish)

SQLite는이 가능성과 같은 데이터베이스를 사용, 실레로 설명하고있는 바와 같이,하지만 명심 파일이 (FAT32의 + 또는 ~ 260) FAT32

에 4GB의 초과 할 수 없습니다 것을 당신은 또한 가상 파일 시스템을 가지고에 관심이있을 수 : Simple Virtual Filesystem in C/C++