Файл C# 2Gb - 4 ГБ в Ram. Зачем?

Я читаю в файле (этот файл состоит из одной длинной строки длиной 2 ГБ).

Это моя функция, которая читает все содержимое файла в память, а затем разбивает строку и помещает: *reader = StreamReader

public List<char[]> GetAllContentAsList()
        {
            int bytesToRead = 1000000;
            char[] buffer = new char[bytesToRead];
            List<char[]> results = new List<char[]>();

            while (_reader.Read(buffer, 0, bytesToRead) != 0)
            {
                char[] temp = new char[bytesToRead];
                Array.Copy(buffer,temp,bytesToRead);
                results.Add(temp);
            }

            return results;
        }

Когда все данные помещаются в список, они занимают 4 ГБ в оперативной памяти. Как это возможно, если размер файла составляет всего 2 ГБ?

*Редактировать

Это то, что я в итоге сделал. Я не преобразовываю массив байтов в строку, я просто передаю байты, манипулируя ими. Это было поле только 2 ГБ в памяти вместо 4 ГБ

 public List<byte[]> GetAllContentAsList()
            {
                int bytesToRead = 1000000;
                var buffer = new byte[bytesToRead];
                List<byte[]> results = new List<byte[]>();

                while (_reader.Read(buffer, 0, bytesToRead) != 0)
                {
                    //string temp = Encoding.UTF8.GetString(buffer);
                    byte[] b = new byte[bytesToRead];
                    Array.Copy(buffer,b,bytesToRead);
                    results.Add(b);
                }

                return results;
            }

1 ответ

Решение

Образованное предположение здесь:

Файл имеет кодировку UTF-8 или ASCII и только (в основном) содержит однобайтовые широкие символы (или, возможно, некоторую другую кодовую страницу, в основном однобайтовую).

Теперь символами.NET являются UTF-16, длина которых составляет 2 (или более) байта.

Итак, в памяти персонажи будут в два раза больше.

Другие вопросы по тегам