将整数列表写入文件的最快方法

Fastest way to write a list of integers to file

我有一个需要写入文件的整数列表。

我想知道是否有比这种需要 1.77 秒的方法更快地将这些整数写入文件的方法?

(列表从一开始就有整数,因为它们在其他需要整数进行快速计算的函数中被处理为整数)

void writeToFile()
{
    List<int> list1 = new List<int>();
    for (int i = 0; i < 5000000; i++)
    {
        list1.Add(123);
    }

    //Approach takes: 1.77 seconds
    DateTime start = DateTime.Now;
    StreamWriter writer = null; FileStream fs = null;
    fs = new FileStream("C:/test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite); 
    writer = new StreamWriter(fs);
    for (int i = 0; i < list1.Count; i++)
    {
        writer.WriteLine(list1[i]);
    }
    writer.Close(); fs.Close();

    DateTime end = DateTime.Now;
    TimeSpan span = end - start;
    MessageBox.Show(span.TotalSeconds.ToString());
}

使用 BufferedStream 无济于事,因为 FileStream 已经有了缓冲区。

使用 BinaryWriter 会有所帮助,因为您将写入 4 个字节(一个整数)而不是 6* 个字节(三个 2 个字节的字符,我们也应该计算换行符)5 000 000 次。但是写入的文件将是二进制的。它不再是人类可读的。

在你的例子中,因为你总是写相同的数字 123,我认为使用压缩也会有一些神奇的作用 ;)

这种方法使用 BinaryWriter VS StreamWriter 需要 0.4 秒(1.77 秒)。
不知是否可以进一步提高速度?

        void writeToFile()
        {
            List<int> list1 = new List<int>();
            for (int i = 0; i < 5000000; i++)
            {
                list1.Add(i);
            }

            //Approach takes: 0.4 seconds
            DateTime start = DateTime.Now;
            BinaryWriter writer = null; FileStream fs = null;
            fs = new FileStream("C:/test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 65536); writer = new BinaryWriter(fs);
            for (int i = 0; i < list1.Count; i++)
            {
                writer.Write(list1[i]);
            }
            writer.Close(); fs.Close();

            DateTime end = DateTime.Now;
            TimeSpan span = end - start;
            MessageBox.Show(span.TotalSeconds.ToString()); //Takes 0.4 seconds


            //Read the integers method
            using (BinaryReader b = new BinaryReader(File.Open("C:/test.txt", FileMode.Open)))
            {
                // 2.
                // Position and length variables.
                int pos = 0;
                // 2A.
                // Use BaseStream.
                int length = (int)b.BaseStream.Length;
                while (pos < length)
                {
                    // 3.
                    // Read integer.
                    int v = b.ReadInt32();
                    // 4.
                    // Advance our position variable.
                    pos += sizeof(int);
                }
            }
        }