![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Приветствую!
Надо писать парсер для текстовых файлов, размер которых может доходить до 1Гб. Формат известен и в принципе можно использовать регулярные выражения. Но пока до этого дело не дошло. Я написал сканнер, который по кусочкам (64К - 1М) читает файлы и довольно быстро разбивает его на лексемы. Сканнер считывает файл как масив байтов. Теперь дело за небольшим ![]() Сейчас начал писать рутины для парсинга примитив, таких как число, строка и т.д. Парсю все из массива байт. Назрел вопрос: можно ли как-то в .НЕТ-е сделать кастинг массиву байтов в строку, так, чтобы сами данные никуда не переписывались? Вероятно я могу использовать RegEx из самого фреймворка, поэтому и спрашиваю. С другой стороны, можно ли этому Регексу дать строку, ну скажем 200Мб? Быстро он ее съест? Может стоит написать самому конструктор автомата - аналог регекса для байтовых массивов? Еще очень большой минус регекса - нечитабельность паттерна, который ему задается. Этот паттерн трудно модифицируем. Как борются с этим? Вообще, что вы думаете обо всем этом? Как лучше подходить к задаче? Считывать файл построчно нет смысла: 1) медленно, 2) у строки в этом формате нет смысла. Некоторые команды занимают больше одной строки, тогда как другие могут быть помещены по нескольку на одну строку. Весь процесс должен быть максимально быстрым и писать можно только на C#. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
neutrino, совершенно не силен в теме. Но совет дать могу: попробуй поискать на codeproject.com: http://www.codeproject.com/info/search.asp...rser&sbo=kw
Parsing Expression Grammar Support for C# 3.0 Part 1 - PEG Lib and Parser Generator Spart, a parser generator framework 100% C# СУВ, ivashkanet |
|||
|
||||
nerezus |
|
||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
Или данная часть программы будет постоянно использоваться?
Сам с гигабайтовыми нормально работал, правда не на C#. |
||||
|
|||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
ivashkanet, Спасибо за совет. Я там вроде кое-что толковое нашел. Надеюсь перформанс мне подойдет.
nerezus, Проблема в том, что структура, которую я строю занимает офигенно много оперативки. Я даже не думаю о том, чтобы выделять 1Гб только для того, чтобы дать его регексу. Но есть и другие ишьюз: 1) регекс нефига не читабелен. Что будет если завтра придет прогер и захочет немного поменять формат? 2) регекс берет строку, а у меня байт-аррэй Вот подумываю о каком-нибудь движке грамматик, так, чтобы сама грамматика была понятна. Кстати, на codeproject есть такие примеры. Очень не хочется изобретать велосипед. Можно ли считать большие куски файла в строки (string)? -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
|
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
nerezus, У меня его нет
![]() Завтра закину пример файлика. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Bladerender |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
А раз распарсить тот файл что нужно, загнать его в свой определенный формат, как-то проиндексировать и потом СтримРидером его подчитывать и работать с ним?
|
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Bladerender, очень долго. Пользователю придется много пить кофе
![]() -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
есть lex, bison и т.п. инструменты.... или даже boost:spirit, правда это все вроде бы c++, но наверно для бизона и лекса есть маппинги и на C# - поройте в ту сторону...
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Bladerender |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Ну понятно что это не поможет если каждый раз будет новый файл с данными. А если это статическая база с чем-то то самое оно. |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Начало файла, для примера выглядит так:
Это файл векторной графики описывающий черчеж одного из слоев печатной платы. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |