Я читаю файл (этот файл состоит из одной длинной строки длиной 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 ГБ?
*Редактировать
Это то, что я в итоге сделал. Я не преобразовываю массив байтов в строку, я просто передаю байты при манипулировании ими. Это было поле только 2Gb в памяти вместо 4gb
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;
}
Array.Copy(buffer,temp,bytesToRead);
продолжает потреблять память до тех пор, пока сборщик мусора не решит убрать за вами, верно? - person Security Hound   schedule 08.05.2013char
может быть больше, чем закодированныеbyte
(s). Почему произвольное созданиеList
и чрезмерное клонирование массивов в вашем коде?Files.ReadAllText("yourfile").ToCharArray()
кажется эквивалентным. - person Jodrell   schedule 08.05.2013