2 回答
TA贡献1842条经验 获得超21个赞
你这样做的方式是最好的方式,因为
您不想一次将整个文件读入 RAM
您的线路处理独立于以前的线路
抱歉,从硬盘读取内容很慢。
改进可能来自其他来源:
将您的文件存储在更快的设备(SSD?)
获得更多 RAM 以将文件读入内存以至少加快处理速度
TA贡献1829条经验 获得超7个赞
首先,您需要读取整个文件还是仅读取文件的一部分。
如果您只需要读取文件的部分
const int chunkSize = 1024; // read the file by chunks of 1KB
using (var file = File.OpenRead("yourfile"))
{
int bytesRead;
var buffer = new byte[chunkSize];
while ((bytesRead = file.Read(buffer, 0 /* start offset */, buffer.Length)) > 0)
{
// TODO: Process bytesRead number of bytes from the buffer
// not the entire buffer as the size of the buffer is 1KB
// whereas the actual number of bytes that are read are
// stored in the bytesRead integer.
}
}
如果需要将整个文件加载到内存中。
重复使用此方法而不是直接加载到内存中,因为您可以控制正在执行的操作,并且可以随时停止该过程。
或者您可以使用https://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx?f=255&MSPPError=-2147217396MemoryMappedFile
内存映射文件将提供从内存访问的程序视图,但它只会第一次从磁盘加载。
long offset = 0x10000000; // 256 megabytes
long length = 0x20000000; // 512 megabytes
// Create the memory-mapped file.
using (var mmf = MemoryMappedFile.CreateFromFile(@"c:\ExtremelyLargeImage.data", FileMode.Open,"ImgA"))
{
// Create a random access view, from the 256th megabyte (the offset)
// to the 768th megabyte (the offset plus length).
using (var accessor = mmf.CreateViewAccessor(offset, length))
{
//Your process
}
}
- 2 回答
- 0 关注
- 193 浏览
添加回答
举报