Мне нужно прочитать в текстовом файле 1gb raw с диска на планшет, чтобы сделать некоторые манипуляции с строками на С#.
string contents = File.ReadAllText(path)
выбрасывает из памяти исключения (неудивительно)
Каков наилучший способ сделать это?
Мне нужно прочитать в текстовом файле 1gb raw с диска на планшет, чтобы сделать некоторые манипуляции с строками на С#.
string contents = File.ReadAllText(path)
выбрасывает из памяти исключения (неудивительно)
Каков наилучший способ сделать это?
Возможно, вы также посмотрите на файл с отображением памяти
Если вы ДЕЙСТВИТЕЛЬНО хотите сделать эту огромную манипуляцию с строкой в памяти, тогда вам больше не повезло, если вы можете выполнить следующие требования.
Это поднимет все ограничения памяти, с которыми вы сталкиваетесь. Ваша память процесса будет ограничена только вашей компьютерной памятью, и на одном объекте .NET, начиная с .NET 4.5 для x64, не будет ограничения на 2GiB.
Попробуйте с System.IO.StreamReader
Разница между File.ReadAllText() и использованием StreamReader для чтения содержимого файла?
Если другие предлагаемые решения не работают, я предлагаю вам установить лимит символов для чтения и прочитать текст по частям. Когда вы кешируете часть текста, вы можете манипулировать им.
Если вы нуждаетесь, чтобы манипулировать им в любом направлении (я имею в виду не слева направо за один шаг), вы всегда можете реализовать B-Tree и сохранить части текста в узлах:)
Иногда почти невозможно работать, читая текст по частям последовательно, и здесь, где помогает B-Tree. Я реализовал его примерно год назад в академических целях (менеджер мини-баз данных), но я думаю, что в С# должны быть его реализации. Конечно, вам придется реализовать, как загрузить узлы BTree из файла.
Я использовал ReadAllText для 109-мегабайтного файла и получал из памяти, что действительно странно. Во всяком случае, поэтому я использовал буфер для чтения файлов с хорошей производительностью и StringBuilder, чтобы сделать память эффективной. Вот мой код:
StringBuilder sb = new StringBuilder();
using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string line;
while ((line = sr.ReadLine()) != null)
sb.AppendLine(line);
}