二进制文件生成性能

时间:2014-07-10 13:55:11

标签: c# multithreading binary-serialization

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

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

  1. 确保您没有编写微小的(几个字节)块。相反,在内存中构建一个缓冲区,然后立即将整个东西写入磁盘。这将减少您正在进行的实际磁盘写入次数(这非常慢)。
  2. 在写入磁盘时,您可能正在构建下一个块(请参阅#1),以便在磁盘完成写入块时,它可以立即写入另一个块。这可以使用许多方案来完成,但是一个流行的方案是有两个线程,一个用于创建块,另一个用于写入磁盘。第一个线程写入队列,另一个队列出列。