C#学习教程:MemoryStream上的OutOfMemoryException我有一个OutOfMemoryException问题(可能真的很愚蠢)。我想将此示例插入到主应用程序中,该应用程序读取一些数据和大量文件,对它们进行一些处理,然后将它们写出。我遇到了一些问题,文件越来越大(可能是GB)并且担心内存,所以我想并行化导致我走这条路的事情。现在下面的代码在较小的文件上获得了OOME,我想我只是遗漏了一些东西。它将读取10-15个文件并将它们并行写入,但随后它会在下一个文件上阻塞。看起来它读写大约650MB。第二组眼睛将不胜感激。我正在从FileStream读取到MemorySteam,因为这是主要应用程序所需要的,我只是想稍微复制一下。它从各种地方读取数据和文件,并将它们作为MemoryStreams进行处理。这是使用.Net4.0Beta2,VS2010。命名空间ParellelJob{类程序{BlockingCollectionserviceToSolutionShare;staticvoidMain(string[]args){Programp=newProgram();p.serviceToSolutionShare=newBlockingCollection();ServiceStagesvc=newServiceStage(refp.serviceToSolutionShare);SolutionStagesol=newSolutionStage(refp.serviceToSolutionShare);varsvcTask=Task.Factory.StartNew(()=>svc.Execute());varsolTask??=Task.Factory.StartNew(()=>sol.Execute());while(!solTask??.IsCompleted){}}}classServiceStage{BlockingCollectionoutputCollection;公共ServiceStage(refBlockingCollection输出){outputCollection=输出;}publicvoidExecute(){vardi=newDirectoryInfo(@"C:temptestfiles");varfiles=di.GetFiles();foreach(FileInfofiinfiles){使用(varfs=newFileStream(fi.FullName,FileMode.Open,FileAccess.Read)){intb;varms=newMemoryStream();while((b=fs.ReadByte())!=-1){ms.WriteByte((byte)b);//OutOfMemory异常n出现在这里}varf=newFileHolder();f.filename=fi.Name;f.contents=ms;outputCollection.TryAdd(f);}}outputCollection.CompleteAdding();}}classSolutionStage{BlockingCollectioninputCollection;publicSolutionStage(refBlockingCollectioninput){inputCollection=input;}publicvoidExecute(){FileHolder当前;while(!inputCollection.IsCompleted){if(inputCollection.TryTake(outcurrent)){使用(varfs=newFileStream(String.Format(@"c:tempparellel{0}",current.filename),FileMode.OpenOrCreate,FileAccess.Write)){使用(MemoryStreamms=(MemoryStream)current.contents){ms.WriteTo(fs);当前内容.Close();}}}}}}classFileHolder{公共字符串文件名{get;放;}公共流内容{得到;放;}}}主逻辑似乎没问题,但如果main循环中的空while是字面意思,那么你正在消耗不必要的CPU周期,最好使用solTask??.Wait()。但是,如果单个文件可以以千兆字节运行,您仍然存在在内存中至少保留1个的问题,通常是2个(1个正在读取,1个正在处理/写入。PS1:我刚刚意识到您没有预先分配MemStream。这很糟糕,对于大文件必须经常调整大小,这会占用大量内存。最好使用以下内容:varms=newMemoryStream(fs.Length);然后,对于大文件,您必须考虑大型对象堆(LOH)。你确定不能把文件分块处理再处理吗?PS2:您不需要构造函数参数的引用,但这不是问题。快速浏览一下,您将获得ServiceStage.Execute方法varms=newMemoryStream();我看不到您在哪里关闭ms或正在使用。您确实在其他课程中使用过。这是一回事。以上就是C#学习教程:关于MemoryStream编写的OutOfMemoryException分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
