Файл 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 (или более) байта.
Итак, в памяти персонажи будут в два раза больше.