1

我在一个文件中有大约 30 000 个要二进制序列化的对象,我正在使用一个简单的 foreach 循环这个基本代码来做到这一点:

FileStream fileStream = new FileStream(pathToFile, FileMode.Create);
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize((Stream) fileStream, objectToSerialize);
fileStream.Close();

我可以使用多线程或其他方式加速进程吗?(内存流等)

4

2 回答 2

3

重用 binaryFormatter 而不是每次都重新创建它。在 FileStream 和格式化程序之间使用 BufferedStream 也可以提高性能。顺便说一句:使用“使用”确保您的文件流已关闭,即使在序列化时引发异常也是如此。

于 2014-07-10T14:17:23.763 回答
1

您将“挤出”一些涉及 IO 的改进性能的唯一方法是确保您在进行 CPU 处理时不等待 IO。但是,您不能并行写入磁盘。它一次只能执行一项操作。

所以你可以做的两件大事是:

  1. 确保您没有编写微小(几个字节)的块。相反,在内存中建立一个缓冲区,然后立即将整个内容写入磁盘。这将减少您正在执行的实际磁盘写入次数(非常慢)。
  2. 在写入磁盘时,您可以构建下一个块(参见 #1),以便在磁盘完成写入块时,它可以立即写入另一个块。这可以使用许多方案来完成,但一种流行的方案是有两个线程,一个用于创建块,另一个用于写入磁盘。第一个线程写入队列和其他出队。
于 2014-07-10T14:22:42.690 回答