在 NTFS 上打开许多小文件太慢

2023-12-23

我正在编写一个程序,应该处理许多小文件,比如说数千甚至数百万。 我一直在 500k 文件上测试该部分,第一步只是迭代一个目录,其中包含大约 45k 目录(包括子目录的子目录等)和 500k 小文件。遍历所有目录和文件,包括获取文件大小和计算总大小大约需要6秒。现在,如果我尝试在遍历时打开每个文件并立即关闭它,看起来它永远不会停止。事实上,这需要太长的时间(几个小时......)。由于我在 Windows 上执行此操作,因此我尝试使用 CreateFileW、_wfopen 和 _wopen 打开文件。我没有在文件上读取或写入任何内容,尽管在最终实现中我只需要读取。然而,我没有看到任何尝试有明显的改进。

我想知道是否有一种更有效的方法来使用任何可用的函数(无论是 C、C++ 还是 Windows API)打开文件,或者唯一更有效的方法是直接读取 MFT 并读取磁盘块,我是这样的我试图避免?

更新:我正在开发的应用程序正在使用版本控制进行备份快照。所以,它也有增量备份。 500k 文件的测试是在一个巨大的源代码存储库上完成的,以便进行版本控制,类似于 scm。因此,所有文件都不在一个目录中。还有大约 45k 个目录(如上所述)。

因此,建议的压缩文件的解决方案没有帮助,因为备份完成后,所有文件都将被访问。因此,我不会从中看到任何好处,甚至会产生一些性能成本。


你想做的事情本质上是困难的any操作系统能够高效地完成任务。 45,000 个子目录无论如何切片都需要大量磁盘访问。

对于 NTFS 而言,任何超过 1,000 字节的文件都是“大”文件。如果有办法让大部分数据文件少于 900 左右bytes,您可以通过将文件数据存储在MFT内来实现显着的效率。那么获取数据不会比获取文件的时间戳或大小更昂贵。

我怀疑是否有任何方法可以优化程序的参数、进程选项,甚至操作系统的调整参数,以使应用程序正常运行。您将面临数小时的操作,除非您能以完全不同的方式重新构建它。

一种策略是将文件分布在多台计算机(可能是数千台计算机)上,并在每台处理本地文件的计算机上都有一个子应用程序,将任何结果提供给主应用程序。

另一种策略是将所有文件重新构建为几个更大的文件,例如 @felicepollano 建议的大 .zip 文件,从而有效地虚拟化您的文件集。随机访问 4000 GB 文件本质上比访问 40 亿个 1 MB 文件更加高效和有效地利用资源。将所有数据移动到合适的数据库管理器(MySQL、SQL Server 等)中也可以实现这一点,并且可能提供其他好处,例如轻松搜索和简单的归档策略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 NTFS 上打开许多小文件太慢 的相关文章

  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • Jenkins 可以检测到任何 svn 用户每次提交代码吗?

    Jenkins 可以检测到任何 svn 用户每次提交代码吗 我想知道每次 Jenkins 提交 svn user 时 有什么方法或 jenkins 插件吗 现在我用svn updateJenkins 中的 cmd 来更新 svn 您可以按照
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐

  • 选择要从中选择的表,取决于已给定表的列值

    为了我的目的 我必须选择一个表来根据已给定表的列值选择列 首先 我考虑了 CASE 构造 如果 sqlite 可以实现的话 SELECT FROM CASE IF myTable column1 value1 THEN SELECT FRO
  • 如何获取可执行文件的版本?

    萨尔维特 我正在编写一个 vb net 程序来更新我的应用程序的自述文件 我想从其他编译的应用程序中提取版本号 我想从可执行文件中读取版本号 而不是从其未编译的资源中读取版本号 如何在 vb net 中执行此操作而不使用像 reshacke
  • 除了锁定的对象之外,我还可以将对象更改保存到另一个 TR 中吗?

    当我尝试切换到报告源的编辑模式时 会出现一个弹出窗口告诉我 将为用户XXX的以下请求创建一个新任务 还提出了运输请求 但是 我不想在此请求中保存我的更改 而是在另一个现有请求中保存更改 我不知道我的系统中正在实施任何版本控制系统 也不知道如
  • iOS ClipsToBounds YES 和 Shadow?

    我有一个浮动的 UITableView 有圆角和设定的高度 但我也想添加阴影 但我的问题是我需要clipsToBounds打开 这样我的单元格就不会超出浮动的 UITableView 是否有办法在为 UITableView 保持 Clips
  • 使用 androidx DialogFragment 创建 AlertDialog 时按钮样式错误

    这是我的根风格
  • Firefox 3 书签中的 Http Auth

    我正在尝试创建一个书签 用于将 del icio us 书签发布到单独的帐户 我从命令行测试了它 例如 wget O no check certificate https seconduser email protected cdn cgi
  • 如何将 Jaeger 与 Spring WebFlux 结合使用?

    我们正在尝试与 Webflux 进行反应 我们将 Jaegar 与 Istio 结合使用来实现检测目的 Jaeger 很好地理解 Spring MVC 端点 但似乎根本不适用于 WebFlux 我正在寻找让我的 webflux 端点出现在
  • 将变量传递给 R 中的 WinBugs 模型

    我正在使用 R2WinBugs 包 我想将之前在 R 脚本中计算的两个参数传递给模型函数 c0yy lt 0 1 syy lt 0 0001 Model model lt function c0yy syy Likelihood for i
  • 如何使用 rspec 测试路由约束

    我正在开发一个主要用作 API 的应用程序 除了一些次要视图 例如会话 注册 这将是 标准 我喜欢最终确定的方法Railscast 350 API 版本控制 http railscasts com episodes 350 rest api
  • JPA/Hibernate 选择查询返回重复记录

    我有一个表 例如 Instrument 其中包含 ID State 和 User ID 作为列 所以我有这个 JPA 查询来返回所有具有匹配的仪器记录 用户身份 query manager createQuery SELECT instru
  • 在 matplotlib 轴上设置科学限制后调整指数文本

    目前 如果我将 matplotlib y 轴刻度标签设置为科学模式 它会在表单 y 轴顶部给出一个指数1e 5 我想调整这个来阅读r mathregular 10 5 这样就可以很好地打印出来 这是我的示例代码 Create a figur
  • jshell 启动时加载脚本的不同方法

    根据文档 还有在启动时加载脚本的选项 包括一些特殊的预定义选项 这些是使用 startup 标志指定的 传入文件名或以下之一 DEFAULT 加载默认行为 这与根本没有指定的行为相同 JAVASE 默认导入所有 Java SE 包 PRIN
  • FormBuilder 控件导致“表达式在检查后已更改”异常

    我有一个正在通过编程方式实例化的表单DynamicComponentLoader loadIntoLocation 表单代码如下 constructor private builder FormBuilder this editForm b
  • 如何使用log4j2(xml中的MDC)将不同的日志写入不同的文件中?

    现在我使用这样的结构 附加器
  • iOS:多个启动图像

    是否可以提供多个启动图像 而不是仅提供一个 Default png 启动图像 我的目标是 例如 您有 5 个不同的启动图像 并且对于每个应用程序启动 它都会显示另一个启动图像 以防万一有人对此做出回应 我知道对于不同的配置 例如屏幕方向 可
  • 如何在两个视图之间生成离线差异输出?

    我正在分析 Clearcase 中两个视图之间的不同文件 我需要生成输出 以便我可以在没有互联网连接的情况下完成此任务 我想要的是运行一个命令 递归地遍历每个视图 并为从视图 A 到视图 B 的每次更改生成一个合并 差异输出文件 这可以像合
  • 关于使用指针修改 const 变量的混乱

    以下示例使我的理解更加混乱 我无法理解如何修改本地 const 变量 请帮助我理解同样的事情 Compile code without optimization option volatile c include
  • 将带有通配符的参数传递给 Python 脚本

    我想做这样的事情 c data gt python myscript py csv 并将目录中的所有 csv 文件传递 给我的 python 脚本 这样sys argv包含 file1 csv file2 csv etc But sys a
  • 在 body 之前发送 head 以尽快加载 CSS 和 JS

    我想知道是否有人找到了一种在渲染中间发送 head 标签的方法 以便在页面渲染完成之前加载 CSS 和 Javascript 我们的页面大约需要 523 毫秒来呈现 并且在收到页面之前不会加载资源 我已经完成了很多 PHP 工作 并且可以在
  • 在 NTFS 上打开许多小文件太慢

    我正在编写一个程序 应该处理许多小文件 比如说数千甚至数百万 我一直在 500k 文件上测试该部分 第一步只是迭代一个目录 其中包含大约 45k 目录 包括子目录的子目录等 和 500k 小文件 遍历所有目录和文件 包括获取文件大小和计算总