读取二进制文件时避免LOH
此问题是将许多二进制文件传输到SQL Server数据库的有效方法的后续操作
我最初问为什么使用File.ReadAllBytes
导致快速内存使用,并且使用该方法得出结论将数据放在大对象堆上,这在运行时期间无法轻易回收。
我现在的问题是如何避免这种情况?
using (var fs = new FileStream(path, FileMode.Open)) { using (var ms = new MemoryStream()) { byte[] buffer = new byte[2048]; int bytesRead; while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, bytesRead); } return new CustomFile { FileValue = ms.ToArray() }; } }
下面的代码旨在通过以块的forms而不是一次性读取文件来解决问题,但它似乎有同样的问题。
内存流包含整个数据的内部数组(最后返回)。 只要你保持连接到内存流,你读取2048字节的块是没关系的。 如果需要将数据作为包含整个文件的数组返回,那么最终通常会将该数组创建为大对象堆。
如果目标(BLOB字段或类似字段)不允许您以单字节数组之外的任何其他方式传入数据,那么您无法绕过分配包含所有数据的字节数组。
当然,如果目标也支持流语义,则将数据传输到目标的最佳方式。
int Transfer(Stream source, Stream target) { byte buffer = new byte[BufSize]; int totalBytesTransferred = 0; while ((bytesRead = source.Read(buffer, 0, BufSize)) > 0) { target.Write(buffer, 0, bytesRead); totalBytesTransferred += bytesRead; } return totalBytesTransferred; }
如果可能,则取决于目标(例如,数据库BLOB)是否支持打开到目标的流。
上述就是C#学习教程:读取二进制文件时避免LOH分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。
如若转载,请注明出处:https://www.ctvol.com/cdevelopment/1005074.html