2016-03-02 81 views
0

我一直在将多个图像文件加载到HTML文档中,然后将其转换为PDF。一次加载单个文件或一次加载所有文件到字典中

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

我想知道什么是更快虽然?是否更快地阅读说明,100MB的文件到内存中,处理它们,然后加载另一个100MB?或者一次只做一个文件会更好吗(无论从哪方面来看,磁盘I/O操作的数量都是相似的)?

+2

当主要操作非常昂贵时,您不太可能会注意到差异。内存快,I/O速度慢。你应该更关注于创建一个程序,当这些图像需要千兆字节时仍然可以工作。这不是不可能的。 –

+0

是的数字。我知道IO操作会很慢,但是没有其他方法! – MightyLampshade

回答

2

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

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

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

+0

同意,我一直在MemoryStream阵营这一部分的发展。将图像作为流加载,还是将其加载到BitMap/Image中并从中进行工作会更好吗?我猜直接传输流会更好 – MightyLampshade

+0

MemoryStream是一个内存缓冲区的包装,而不是'真正'的流。如果可以的话,不要加载图像,使用原始数据(FileStream或类似的东西) – Guillaume

0

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

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

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

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

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

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

请注意,如果您不明白线程和线程池的含义,或者您没有做过与磁盘io有关的多线程开发,那么您最好一次只使用一个文件,除非提高总处理时间是您无法避开的要求。有很多关于如何在MSDN上使用线程的例子,但是如果你没有做太多的话,这可能不是一个好的线程第一个项目。