并行调整图像大小导致内存不足异常

时间:2017-03-30 02:03:07

标签: c# .net out-of-memory gdi+ parallel.foreach

我正在将大量图像并行调整为1000x1000缩略图,并且很快就会耗尽内存。 (性能分析器在大约3分钟后让我使用3GB的已用内存)

最初我使用Image.FromFile()但是做了一些研究,我发现Image.FromStream()是要走的路。我认为我有适当的使用陈述,某些东西仍然保留在内存中,GC不能按预期清理资源。

GDI +似乎存在问题,保持句柄处于打开状态,但我似乎无法为我的案例找到合适的解决方案。

问题:

  1. 我做错了什么?
  2. 如果没有,是否有更好的方法来{/ 1}}流/图像/ ResizedImage,这样我就不会占用所有资源,同时还能保持快速的并行操作?
  3. 如果GDI +出现问题且保持非托管资源存活,我该如何解决问题?
  4. 代码

    Dispose()包含~300个有效的JPG图像,每个JPG~2-4mb

    呼叫者

    List<FileInfo> files

    public void Execute() { Parallel.ForEach(Files, (file) => { Resize.ResizeImage(file.FullName); } ); } 调用Parallel.Foreach()..

    调整类

    Execute()

1 个答案:

答案 0 :(得分:3)

This explanation并行性指出我的 public void test(){ //assuming we have 3k users and use jdbcTemplate to perform batch update batchUpdateUsers(userList) ; //This list doesn't contain latest information of user after update List<User>updatedUsers = userRepository.findAll(); } 基本上创造了过多的新任务,因为它正在等待磁盘访问。在大约5分钟的标记处,以及在抛出异常的时候,有大约160个线程。降低并行度限制了创建的线程数量,以及在内存中等待超出范围并被处理之前等待完成加载或写入磁盘的映像数量。设置Parallel.ForEach()似乎是网络磁盘访问的最佳点,并将我的线程数减少到25左右,并将CPU利用率提高到约35%(由于GC阻塞线程和CPU开销,从17-24%增加来自太多线程)

MaxDegreeOfParallelism = 2

谢谢@ZacFaragher。