【问题标题】:Delete Files Efficiently Windows C++有效删除文件 Windows C++
【发布时间】:2014-05-10 07:07:21
【问题描述】:

我有一个长时间运行的进程,它创建一个小图像 (~1-2 kb) 并将其加载到内存中。因为它是使用 APK 创建的,所以我必须在将其加载到内存之前将其保存到文件中。那时我不再需要该文件。该过程可能会创建数百万个此类文件。

我正在使用 Visual C++.NET,这是一个基于 Windows 的应用程序。我想知道解决这个问题的最佳方法。

我可以通过调用 DeleteFile (http://msdn.microsoft.com/en-us/library/aa363915(v=vs.85).aspx) 随时删除它们,但我想知道该操作是否有开销,我是否应该使用通配符和命名约定每 10k 或 100k 个文件执行一次。

这值得努力吗?这里有什么取舍?

【问题讨论】:

  • 也许这个问题可以帮助你。 Link
  • 好吧,在我读完它是 base64 编码并发送到另一个进程后,我再也不需要这个文件了,我只需要一些关于删除数百万个这些文件的最佳方法的建议。
  • 可能会将它们全部放入一个目录中,然后在 1 次交互中删除该目录。
  • 嗯,DeleteFile 没有通配符版本,所以你所谓的替代方案不存在。
  • 也许您可以使用一个新线程来删除该特定目录中的所有文件。

标签: c++ .net windows temp


【解决方案1】:

使用FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE。它们一起告诉 Windows 你打算如何使用这个文件。

这种组合意味着 Windows 会将文件保存在文件缓存中,直到您关闭它的句柄,此时它会从内存中删除。你甚至不需要DeleteFile!由于所有语义仍然是普通文件的语义,因此您无需更改任何其他内容。

【讨论】:

  • 您的解决方案要求 OP'er 还使用 FILE_ATTRIBUTE_TEMPORARY 标志创建 APK 文件。如果 OP 可以控制创建图像文件的过程,那么这是最好的解决方案。但是,如果他不这样做,那么这将不起作用。
【解决方案2】:

这不值得努力。只需将文件放入用户的临时文件夹,随时删除文件,不要关心在紧急情况下(即应用程序崩溃的情况下)留下的文件。无论如何,它们都会被系统的清理过程清理掉。

原因:你已经做了很多 IO:

  1. 创建文件(打开以供写入)
  2. 写入文件
  3. 读取文件

“删除”调用将只是链中的第四个 - 与首先创建文件一样轻。

【讨论】:

    【解决方案3】:

    由于您没有提到任何数据完整性要求,并且您的临时文件非常小(~1-2 kb)加上有很多磁盘 I/OI 建议映射 @987654321 @ 在服务器上并使用该驱动器来存储和检索图像。

    使用 RAM 驱动器的工作方式与辅助存储(硬盘)类似,但实际上所有内容都存储在主存储 (RAM) 中。这将加速所有(CRUD)I/O,例如创建文件、读取文件、写入文件和删除文件,因为 RAM 有 a lot higher data throughput than a harddisk

    【讨论】:

    • Ram 驱动器设置起来很麻烦,完全没有抓住重点。 Windows 有一个文件缓存,其作用完全相同(使用 RAM 代替磁盘)。
    • @MSalters 我只是想考虑 OOTB,因为 OP 的问题是 I/O 效率。由于他也从未提及数据完整性,因此某种主存储 (RAM) 解决方案是 IMO 的最佳选择——在这种情况下,RAM 磁盘或文件缓存都很好。如果 OP 还可以控制创建文件的过程,那么您对手头问题的解决方案似乎比我的更受欢迎,如果他没有,那么创建数百万个文件的开销很大,他仍然必须删除它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2022-11-27
    • 1970-01-01
    • 2011-04-19
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多