C # Очень Большая Манипуляция Строки (Исключение Недостаточно памяти) - PullRequest
17 голосов
/ 10 мая 2011

Мне нужно прочитать текстовый файл объемом 1 ГБ с диска на оперативную память, чтобы выполнить некоторые манипуляции со строками в C #.

string contents = File.ReadAllText(path)

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

Как лучше всего это сделать?

Ответы [ 5 ]

13 голосов
/ 10 мая 2011

Возможно также посмотреть на использование отображенного в память файла

7 голосов
/ 30 июля 2015

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

  1. Скомпилировать таргетинг x64
  2. Выполнитьв системе x64
  3. Target .NET 4.5

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

4 голосов
/ 10 мая 2011
0 голосов
/ 11 января 2017

Я использовал 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);
                }
0 голосов
/ 10 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...