Я всегда думал, что MVVM и PresntationModel http://martinfowler.com/eaaDev/PresentationModel.html являются по существу тем же самым. PresentationModel намного легче заявить. Я использовал его успешно в колебании Java, формах окон, WPF и Silverlight. Если Вы думаете с точки зрения разделения проблем, Модель Представления имеет много смысла. У Вас есть один класс, чей только касаются, предоставляет Представлению дружественную Модель. Действительно не имеет значения, что технология используется для показа его на экране. Это могло бы изменить некоторые детали реализации, но разделение проблем независимо является хорошей идеей, неважно, как Вы показываете информацию. Из-за того разделения Вы можете легко тесты записи против своей модели представления независимо от технологии представления. Таким образом, это плюс.
Ответ:
Нет простого способа
Я нашел StreamRegex-Class , который мог бы делать то, что я ищу.
Из того, что я мог понять алгоритм:
Таким образом, нет необходимости загружать полный файл - или хотя бы шансы на загрузку в память полного файла уменьшаются ...
Однако: в худшем случае во всем файле нет совпадений - в этом случае полный файл будет загружен в память.
Регулярное выражение - не лучший вариант, особенно с такими большими объемами текста. Создайте собственный небольшой синтаксический анализатор:
. Это даст вам все начальные и закрывающие номера смещений блоков комментариев. Теперь у вас должна быть возможность заменить их, создав временный файл и записав текст из исходного файла во временный (и написав что-нибудь еще, если вы, конечно, внутри блока комментариев).
Изменить: исходные файлы 2 ГБ ??
I would say you should pre-parse/normalize the data before doing your replacements so that each line describes one possible set of data that needs to have replacements applied. Otherwise you get into complications with data integrity that cannot really be solved without a host of other difficulties.
If there is a way to chunk the data into logical blocks then you could build a program that uses a mapreduce pattern to parse the data.
Возможно, вы могли бы загрузить 2 строки за раз (или больше, в зависимости от того, сколько строк, по вашему мнению, будут охватывать ваши совпадения), и перекрыть их, например: строки загрузки 1-2, затем строки загрузки следующего цикла 2-3, следующие строки загрузки 3 -4; и выполняйте многострочные регулярные выражения для обеих строк вместе в каждом цикле.
I'm with Bart; you really should be using some kind of parser for this.
Or, if you don't mind spawning a child process, you could just use sed (there's a native port on windows, or you can use Cygwin)
Если вы не против немного испачкать руки (и ваше регулярное выражение достаточно простое, или, возможно, вы сильно хотите скорости и не боитесь немного пострадать), вы можно использовать Рагель . Он может быть нацелен на C #, хотя на сайте это не упоминается. Вам нужно будет обернуть FileStream, чтобы предоставить буферизованный индексатор, или использовать файл с отображением памяти (с небезопасными указателями) в 64-битном процессе, чтобы использовать это с большими файлами.