一次加载一个文件或一次将所有文件加载到字典中

本文关键字:文件 加载 一次 字典 一个 | 更新日期: 2023-09-27 18:37:01

我一直在做一些工作,将多个图像文件加载到HTML文档中,然后将其转换为PDF。

我不确定具体细节,但我的印象是最好一次读取一个文件并保持较低的内存占用,而不是一次将所有文件加载到内存中(在字典中)(有这么多图像 - 集合可以大到 500MB!

我想知道什么更快?读取 100MB 的文件到内存中,处理它们,然后加载另一个 100MB 会更快吗?还是一次执行一个文件更好(磁盘 I/O 操作的数量肯定在任一方面相似)?

一次加载一个文件或一次将所有文件加载到字典中

最好逐个读取文件,因为它的内存效率更高。如果可以,您应该只使用流而不是在内存缓冲区中。

使用更多内存时,数据可能会以页面文件结尾,从而导致更多的磁盘 I/O 操作。

如果您不想看到 OutOfMemoryException,则应避免使用大内存块。

这取决于很多事情,但从根本上说,磁盘比内存慢得多,所以如果你做得对,你可以通过读取来获得收益。

首先,警告:如果您没有足够的内存来容纳您尝试加载的文件,那么您的操作系统会将内存分页到磁盘,这将减慢您的系统速度,远远超过一次读取一个文件,所以要小心。

提高磁盘 io 性能的关键是保持磁盘繁忙。 一次读取一个会使磁盘在内存中处理文件时处于空闲状态。 将一组文件读入大内存块,但仍一次读取一个文件,然后处理文件块,除非在非常不寻常的情况下,否则可能不会提高性能。

如果您的目标是减少从开始到结束处理这些文件的时间,您可能希望在多个线程上运行;打开和读取文件的系统调用仍然需要时间来排队,因此根据磁盘的功能,通常可以通过在磁盘加载另一个请求时至少排队一个读取请求来获得更好的整体 IO 吞吐量;这最大限度地减少了请求,并将磁盘保持在绝对最大值。 请注意,排队的请求过多可能会降低性能。

由于内存中的

处理速度可能更快,因此可以设置至少 2 个线程来读取文件,并设置至少 1 个线程来处理其他线程已加载到内存中的文件。

比管理自己的线程更好的方法是使用线程池;这自然会将 IO 请求的数量限制为允许的并发线程数,并且不需要您自己管理线程。 这可能不是很理想,但线程池应该比一次处理一个文件更快,并且比管理线程更容易/更安全。

请注意,如果您不理解我所说的线程和线程池是什么意思,或者您没有做太多与磁盘io相关的多线程开发,那么最好一次坚持使用一个文件,除非改善总处理时间是您无法绕过的要求。 有很多关于如何在 MSDN 上使用线程的示例,但如果您没有做太多,这可能不是一个很好的线程处理的第一个项目。