通过 Windows 中的常规文件传输 1-2 兆字节的数据 - 是不是比通过 RAM 慢?
Posted
技术标签:
【中文标题】通过 Windows 中的常规文件传输 1-2 兆字节的数据 - 是不是比通过 RAM 慢?【英文标题】:Transferring 1-2 megabytes of data through regular files in Windows - is it slower than through RAM?通过 Windows 中的常规文件传输 1-2 兆字节的数据 - 是否比通过 RAM 慢? 【发布时间】:2014-04-01 17:33:27 【问题描述】:我使用一个普通的旧文件将 1-2 MB 的数据从一个进程传递到另一个进程。它是否比完全通过 RAM 慢得多?
在回答“是”之前,请记住,至少在现代 Linux 中,当写入文件时,它实际上是写入 RAM,然后守护程序会不时将数据同步到磁盘。因此,如果进程 A 将 1-2 MB 写入文件,则进程 B 在 1-2 秒内读取它们,进程 B 将简单地读取缓存的内存。它甚至比这更好,因为在 Linux 中,在将新文件写入硬盘之前有几秒钟的宽限期,所以如果文件被删除,它根本不会写入硬盘。这使得通过文件传递数据的速度与通过 RAM 传递数据一样快。
现在是 Linux,Windows 也是这样吗?
编辑:只是列出一些假设:
-
操作系统相当新 - 适用于台式机的 Windows XP 或更新版本,适用于服务器的 Windows Server 2003 或更新版本。
文件明显小于可用 RAM - 比方说不到可用 RAM 的 1%。
文件在写入几秒钟后被读取并删除。
【问题讨论】:
它必须取决于您的配置。也许,您可以同时尝试并比较结果? 配置是什么意思?你是说硬件配置吗?坦率地说,我不明白这有什么关系。或者只是操作系统版本?对于操作系统版本 - 任何基于 NT 的版本,比如 XP 或更新版本,Server 2003 或更新版本的服务器。 事实上,一切都很重要。这就是为什么我在这个网站上停留了这么久——问题出现在你认为不可能的地方。对于您的问题,您可能会得到理论上的答案,但现实可能会有所不同。唯一确定的方法是亲自尝试。顺便说一句,这是在 SE 上提出一个好问题的先决条件。除非你的兴趣纯粹是理论上的。 我不知道怎么理解。您的意思是硬件配置会影响 Windows 的缓存行为吗?它以什么方式影响它? 【参考方案1】:当您读取或写入文件时,Windows 通常会将部分或全部文件保留在内存中(在备用列表中)。因此,如果再次需要它,将它映射到进程的内存空间只是一个软页面错误。
文件的哪些页面将被保留(以及保留多长时间)的算法没有公开记录。所以简短的回答是,如果你幸运的话,部分或全部可能仍然在记忆中。您可以使用 SysInternals 工具 VMmap 来查看测试期间您的哪些文件仍在内存中。
如果您想增加数据保持常驻的机会,那么您应该使用Memory Mapped Files 在两个进程之间传递数据。
Windows 内存管理的好读物: Mysteries of Windows Memory Management Revealed
【讨论】:
只是指出缩小范围的 2 件事 - 文件被假定明显小于可用 RAM - 1-2 MB,我们假设它们被立即读取,或者最多 1-2写完后几秒钟。 @sashoalm,当第二个开始读取文件时,第一个进程是否仍在运行? 就我而言,确实如此。这会影响缓存行为吗? @sashoalm,如果两个进程同时运行,那么内存映射文件会变得更加有用,因为您更有可能确保整个文件保持常驻。 “更好的机会” - 所以即使这样也不是 100% 确定?不使用磁盘访问的机会有多好?甚至确定这是一个更好的机会吗?通过阅读该文档,似乎在所有情况下实际磁盘访问的可能性都是未知的 - 对于常规、临时和内存映射文件。【参考方案2】:您可以使用FILE_ATTRIBUTE_TEMPORARY 暗示磁盘上永远不需要此数据:
用于临时存储的文件。如果有足够的高速缓存可用,文件系统会避免将数据写回大容量存储器,因为通常情况下,应用程序会在句柄关闭后删除临时文件。在这种情况下,系统可以完全避免写入数据。否则,在句柄关闭后写入数据。
(即,您需要在 CreateFile 中使用该标志,并在关闭该句柄后立即使用 DeleteFile)。
但是即使文件仍然处于缓存状态,您仍然需要将其复制两次:从进程 A 复制到缓存(WriteFile 调用),以及从缓存复制到进程 B(ReadFile 调用)。
使用内存映射文件(MMF,正如 josh poley 已经建议的那样)具有避免一个副本的主要优点:相同的物理内存页面被映射到两个进程中。
MMF 可以由虚拟内存支持,这基本上意味着它始终保留在内存中,除非需要交换。
主要的缺点是你不能轻易地增加内存映射来适应不断变化的需求,你会被初始大小困住。
这对于 1-2 MB 数据传输是否重要主要取决于您获取数据的方式以及您对数据的处理方式,在许多情况下,额外的副本并不重要。
【讨论】:
谢谢,但我并没有征求我应该做什么的建议。我在询问 Windows 的缓存行为。这是一个具体的理论问题。 “但是即使文件仍然被缓存,你仍然需要复制它两次” - 抱歉,我不清楚,我的意思是 明显慢,即它会因为进程 B 而慢 100-200 倍必须从磁盘存储而不是 RAM 读取数据。 @sashoalm:请参阅 MSDN 关于 FILE_FLAG_TEMPORARY 的引用:** 如果有足够的高速缓存可用,文件系统会避免将数据写回大容量存储设备** - 所以不,通常不会写入磁盘。以上是关于通过 Windows 中的常规文件传输 1-2 兆字节的数据 - 是不是比通过 RAM 慢?的主要内容,如果未能解决你的问题,请参考以下文章
Windows CLI:将列表通过管道传输到 awk 并用外部文件中的文本替换文本并写入 output.txt