【问题标题】:Fatfs significant slow down in directories with many filesFatfs 在包含许多文件的目录中显着减慢
【发布时间】:2019-03-20 04:13:41
【问题描述】:

我有一个在 STM32F7 上运行的数据记录系统,它使用 ChaN 的 FatFs 将数据存储到 SD 卡: http://elm-chan.org/fsw/ff/00index_e.html

每组新数据都存储在带有目录的单独文件中。在设备上进行后处理期间,会读取每个文件,然后将其删除。在测试了一个包含 5000 个文件的目录中的打开、读取、删除序列后,我发现我扫描的目录越远,它的速度就越慢。

一开始这个循环大约需要 100-200 毫秒,2000 个文件,现在需要 700 毫秒。有没有更快的存储、读取、删除数据的方法?还是配置 FatFs?

编辑:抱歉应该指定,我使用 FAT32 作为 FAT 文件系统

f_opendir(&directory, "log");
while(1) {
    f_readdir(&directory, &fInfo);
    if(fInfo.fname[0] == 0) {
      //end of the directory
      break;
    }

    if(fInfo.fname[0] == '.') {
      //ignore the dot entries
      continue;
    }

    if(fInfo.fattrib & AM_DIR) {
      //its a directory (shouldnt be here), ignore it
      continue;
    }

    sprintf(path, "log/%s", fInfo.fname);
    f_open(&file, path, FA_READ);
    f_read(&file, rBuf, btr, &br);
    f_close(&file);

    //process data...

    f_unlink(path); //delete after processing
}

【问题讨论】:

  • FAT 在旧的 DOS 文件系统中? IIRC,它的目录表只是未排序的条目数组,所以,是的,目录中的文件越多,搜索该表的速度就越慢。现代文件系统使用更好的数据结构(如 b 树)来更有效地查找条目。
  • 这是 FAT 文件系统的一个众所周知的问题。 (我曾经使用过一个采集系统,它在一个目录中存储了数万个文件,天哪,这很痛苦。)真正唯一的解决方案是“不要那样做”(或者,如果可以的话,使用更好的文件系统)。

标签: c embedded stm32 sd-card fatfs


【解决方案1】:

您可以通过将文件拆分到多个目录中来缩短目录链(只需为每 500 个左右的文件创建一个新的子目录)。这可以使访问特定文件的速度更快一些,因为要走的链平均变得更短。 (这只是假设您不是在搜索具有特定名称的文件,而是按照文件创建的顺序处理文件 - 在这种情况下,搜索算法可以非常简单)。

除此之外,没有太大希望更快地获得一个简单的 FAT 文件系统。这是旧 FAT 技术的主要问题。

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多