С# Очень большое строковое манипулирование (исключение из памяти)

Мне нужно прочитать в текстовом файле 1gb raw с диска на планшет, чтобы сделать некоторые манипуляции с строками на С#.

string contents = File.ReadAllText(path)

выбрасывает из памяти исключения (неудивительно)

Каков наилучший способ сделать это?

Ответ 2

Если вы ДЕЙСТВИТЕЛЬНО хотите сделать эту огромную манипуляцию с строкой в ​​памяти, тогда вам больше не повезло, если вы можете выполнить следующие требования.

  • Скомпилировать таргетинг x64
  • Запуск в системе x64
  • Target.NET 4.5

Это поднимет все ограничения памяти, с которыми вы сталкиваетесь. Ваша память процесса будет ограничена только вашей компьютерной памятью, и на одном объекте .NET, начиная с .NET 4.5 для x64, не будет ограничения на 2GiB.

Ответ 4

Если другие предлагаемые решения не работают, я предлагаю вам установить лимит символов для чтения и прочитать текст по частям. Когда вы кешируете часть текста, вы можете манипулировать им.

Если вы нуждаетесь, чтобы манипулировать им в любом направлении (я имею в виду не слева направо за один шаг), вы всегда можете реализовать B-Tree и сохранить части текста в узлах:)

Иногда почти невозможно работать, читая текст по частям последовательно, и здесь, где помогает B-Tree. Я реализовал его примерно год назад в академических целях (менеджер мини-баз данных), но я думаю, что в С# должны быть его реализации. Конечно, вам придется реализовать, как загрузить узлы BTree из файла.

Ответ 5

Я использовал 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);
                }