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

时间:2016-03-02 15:43:09

标签: c# image dictionary memory loading

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

我不确定具体细节,但我觉得最好一次读取一个文件并保持内存不足,而不是将所有文件加载到内存中(在字典中)立刻(有很多图像 - 集合可以大到500MB!)。

我想知道什么更快?读取说,100MB的文件到内存,处理它们,然后加载另外100MB更快?或者最好一次只做一个文件(当然,磁盘I / O操作的数量在两方面都是相似的)?

2 个答案:

答案 0 :(得分:2)

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

当您使用更多内存时,您的数据可能以page file结尾,从而导致更多磁盘I / O操作。

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

答案 1 :(得分:0)

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

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

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

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

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

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

请注意,如果您不了解线程和线程池的含义,或者您还没有完成与磁盘相关的多线程开发,那么最好不要使用一个文件一段时间,除非改善总处理时间,否则您无法绕过。有很多关于如何在MSDN上使用线程的例子,但如果你做得不多,这可能不是一个很好的第一个线程项目。