gpt4 book ai didi

c# - FileStream.Write() 抛出 OutOfMemoryException 的可能原因?

转载 作者:行者123 更新时间:2023-11-30 16:36:41 25 4
gpt4 key购买 nike

我有 10 个线程将数千个小缓冲区(每个 16-30 字节)写入随机位置的大文件。一些线程在 FileStream.Write() 操作上抛出 OutOfMemoryException。

导致 OutOfMemoryException 的原因是什么?要寻找什么?

我正在像这样使用 FileStream(对于每个书面项目 - 此代码从 10 个不同的线程运行):

using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite, BigBufferSizeInBytes, FileOptions.SequentialScan))
{
...
fs.Write();
}

我怀疑 FileStream 中分配的所有缓冲区都没有被 GC 及时释放。我不明白的是,为什么 CLR 不是抛出异常,而是运行 GC 循环并释放所有未使用的缓冲区?

最佳答案

如果如您的代码所示有 10 个线程正在打开文件,那么您同时最多有 10 个未处理的 FileStream 对象。是的,FileStream 确实有一个内部缓冲区,其大小是您在代码中用“BigBufferSizeInBytes”指定的。能否请您透露确切的值(value)?如果它足够大(例如 ~100MB),那么它很可能是问题的根源。

默认情况下(即当您在构造时未指定数字时),此缓冲区为 4kB,这通常适用于大多数应用程序。一般来说,如果您真的关心磁盘写入性能,那么您可以将这个增加到 100kB,但不会更多。

但是,对于您的特定应用程序,这样做没有多大意义,因为在 Dispose() FileStream 对象之前,所述缓冲区永远不会包含超过您写入其中的 16-30 个字节。

为了回答您的问题,只有当 GC 运行之后无法分配请求的内存时,才会抛出 OutOfMemoryException。同样,如果缓冲区真的很大,那么系统可能还有大量剩余内存,而不是连续 block 。这是因为大对象堆永远不会被压缩。

关于c# - FileStream.Write() 抛出 OutOfMemoryException 的可能原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com