我需要从 5+GB 文件中查找所有字节值的总和。问题是关于性能的:当我只使用常用的表达式,如 .Sum()
、 .Aggregate()
或 foreach
,并在Parallel.For
循环中制作所有这些 - 它确实有效,但我被告知有一些程序快 10 倍。它是我的。(我也正在使用FileStream
异步模式打开并MemoryMappedFile
通读的实例(
// ... Above there is some Parallel.For loop
// ... Which is about to read file in chunks
// Prepare array to read bytes
Byte[] chunk = new Byte[readingChunkSize];
// Create an accessor to perform it
using (var viewAccessor = memMappedFile.CreateViewAccessor(overallMemoryOffset, readingChunkSize, MemoryMappedFileAccess.Read))
{
// Loading desired data
viewAccessor.ReadArray(
0,
chunk,
0,
Convert.ToInt32(readingChunkSize));
}
// Summing all the byte values
Int64 sumFragment = 0;
for (Int64 i = 0; i < readingChunkSize; i++)
{
sumFragment += chunk[i];
}
// Adding it to result
Interlocked.Add(ref bytesSum, sumFragment);
我想这是不明显的事情,因为添加更多的异步Task
只会降低性能。
您可以尝试将字节的总和卸载到使用者线程,但最终获取总和的速度受到从文件系统读取字节的速度的限制。就我个人而言,我已经通过使用在多个线程中运行的多个阅读器来读取单个大文件的实验,并且我看到的改进不超过x2,并且仅在从SSD读取时。从我的外部磁盘,使用单个阅读器读取实际上更快。我没有用过MemoryMappedFile
,只有stream.Read
。