首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次加载一个文件或一次加载所有文件到字典中

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

Stack Overflow用户
提问于 2016-03-02 23:43:09
回答 2查看 163关注 0票数 0

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

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

我想知道什么是更快的?比方说,将价值100MB的文件读入内存,对其进行处理,然后再加载100MB,是不是更快?还是一次只处理一个文件更好(当然磁盘I/O操作的数量在这两个方面都是相似的)?

EN

回答 2

Stack Overflow用户

发布于 2016-03-02 23:54:34

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-03-03 00:02:18

这取决于许多东西,但从根本上说,磁盘比内存慢得多,所以如果你做得正确,你可以通过阅读获得好处。

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

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

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35751815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档