我正在将大量图像并行调整为1000x1000缩略图,并且很快就会耗尽内存。 (性能分析器在大约3分钟后让我使用3GB的已用内存)
最初我使用Image.FromFile()
但是做了一些研究,我发现Image.FromStream()
是要走的路。我认为我有适当的使用陈述,某些东西仍然保留在内存中,GC不能按预期清理资源。
GDI +似乎存在问题,保持句柄处于打开状态,但我似乎无法为我的案例找到合适的解决方案。
问题:
Dispose()
包含~300个有效的JPG图像,每个JPG~2-4mb
List<FileInfo> files
public void Execute()
{
Parallel.ForEach(Files, (file) =>
{
Resize.ResizeImage(file.FullName);
}
);
}
调用Parallel.Foreach()..
Execute()
答案 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。