Самый быстрый способ записать список целых чисел в файл - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть список целых чисел, которые мне нужно записать в файл.

Интересно, есть ли более быстрый способ записи этих целых чисел в файл, чем этот подход, который занимает 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());
}

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Использование BufferedStream не поможет, потому что FileStream уже имеет буфер.

Использование BinaryWriter может помочь, потому что вы напишите 4 байта (одно целое число) вместо 6 * байтов (три символа) 2 байта, и мы должны посчитать переводы строки) 5 000 000 раз. Однако записанный файл будет двоичным. Он больше не будет читаться человеком.

В вашем примере, потому что вы всегда пишете одно и то же число 123, я думаю, что сжатие тоже вызовет магию c;)

0 голосов
/ 04 апреля 2020

Этот подход занимает 0,4 секунды с использованием BinaryWriter VS StreamWriter (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);
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...