【问题标题】:Fast open thousands of files in linux/c在 linux/c 中快速打开数千个文件
【发布时间】:2013-01-12 19:00:42
【问题描述】:

我正在做 SDCARD 扫描仪,它扫描每个文件夹和图像文件。

我正在使用 C 代码并使用 opendir、readdir、fopen API 来枚举目录和打开的文件。我有不同的 DIR 变量。

问题是 fopen() 花费了太多时间(10000 个文件需要 300 秒),而导向器遍历需要大约 25 秒。

是否有任何 API 可以让我加快文件打开操作,使用句柄、dir_ino 或类似名称,以便我可以使用目录句柄或类似名称打开文件。

到目前为止,我已经尝试过使用 dirent->dir_ino, DIR* 但没有运气。

我正在寻找比 fopen 花费更少的时间的低级 api。

编辑 fts 和 ftw api 有用吗?它们似乎仅与遍历目录有关...还有其他 hack 或方法吗?

【问题讨论】:

  • 在我编辑之前,为什么是Android标签?
  • 速度限制不是来自 API,而是来自 SD 卡本身。
  • @Simon 我猜,因为它在 Android 系统上。
  • @mouviciel: 对,但是fopen 需要一个文件名,这意味着它将重新访问程序刚刚查找的目录列表(可能有几个级别,因此扫描多个目录) .这可能会或可能不会花费大量成本,您可能希望文件系统或块设备通过缓存目录列表来避免不必要的磁盘(卡)活动。如果你真的很幸运,Android 会提供一些保证。
  • @SteveJessop okey dokey,只是检查一下。

标签: android c file-io


【解决方案1】:

唯一的“低级”函数是open

int fd = open(dirent->d_name, O_RDONLY);

不过,fopen 应该不会慢很多。

【讨论】:

  • 感谢 Olaf,只有当 d_name 属于当前工作目录时,上述 API 才会返回有效的 fd。如果我调用 chdir() 那么它几乎需要相同的时间......所以有没有办法避免 chdir() 或在目录句柄上调用 open。
  • @JRC 如果你想打开文件,open 或fopen 是没有办法的。如果您使用strcpy 和strcat 将完整路径连接到字符数组中,您当然可以避免chdir 调用。
  • 我们如何使用 DIR* 和 struct dirent.d_ino 值?
  • @JRC 你不能。 DIR 仅对 readdir 有意义,而 ino 是一个低级文件系统结构,它可能存在也可能不存在。例如,DOS fs 没有 ino。
  • fts 和 ftw api 有用吗?它们似乎只与遍历目录有关......还有其他黑客或方法吗?
猜你喜欢
  • 2016-12-14
  • 2016-07-25
  • 2013-10-17
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多