我有一个大磁盘文件(大约 8 GB),其中包含我需要读取、在内存中处理和写回另一个文件的几百万条记录。所有记录的长度都是固定的(比如 100 字节)。
我正在考虑将我的进程并行化以在多个线程(通常为 4-8 个)上运行,每个线程将(专门)分配文件的特定部分来处理(例如,1 GB 块)。由于每个线程都会将其读取和写入限制在分配给它的文件部分,因此我的代码不存在竞争风险。
我是否允许初始化多个线程,每个线程都有自己的FileStream
,以便在没有锁定的情况下读取/写入同一个文件,而不会有损坏的风险?假设目标文件已经提前(使用FileStream.SetLength
)扩展至其完整大小,并且FileShare
在打开每个FileStream
.
另外,如果多个线程同时访问同一个文件,我是否会因缓冲丢失而面临减速的风险?我担心 MSDN 文档中关于FileStream
class的“Detection of stream position changes”部分,其中指出:
当一个
FileStream
对象的句柄没有独占保留时,另一个线程可以同时访问文件句柄并更改与文件句柄关联的操作系统文件指针的位置。[…]如果在对该方法的调用中检测到句柄位置发生意外更改
Read
,.NET Framework 将丢弃缓冲区的内容并再次从文件中读取流。这可能会影响性能,具体取决于文件的大小以及可能影响文件流位置的任何其他进程。
这是否适用于我的情况,或者由FileStream
实例创建的文件句柄是否不同且独立,即使访问同一个文件?