Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка парсера. Общие положения. 
:(
    Опции темы
neutrino
Дата 13.7.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Приветствую!

Надо писать парсер для текстовых файлов, размер которых может доходить до 1Гб. Формат известен и в принципе можно использовать регулярные выражения. Но пока до этого дело не дошло.
Я написал сканнер, который по кусочкам (64К - 1М) читает файлы и довольно быстро разбивает его на лексемы. Сканнер считывает файл как масив байтов. Теперь дело за небольшим smile распарсить эту тонну лексем. Все лексемы в паняти держать не могу, т.к. конечная структура в которою я парсю код не всегда умещается в памяти. Делаю все по кусочкам.

Сейчас начал писать рутины для парсинга примитив, таких как число, строка и т.д. Парсю все из массива байт. Назрел вопрос: можно ли как-то в .НЕТ-е сделать кастинг массиву байтов в строку, так, чтобы сами данные никуда не переписывались? Вероятно я могу использовать RegEx из самого фреймворка, поэтому и спрашиваю. С другой стороны, можно ли этому Регексу дать строку, ну скажем 200Мб? Быстро он ее съест? Может стоит написать самому конструктор автомата - аналог регекса для байтовых массивов? Еще очень большой минус регекса - нечитабельность паттерна, который ему задается. Этот паттерн трудно модифицируем. Как борются с этим?

Вообще, что вы думаете обо всем этом? Как лучше подходить к задаче? Считывать файл построчно нет смысла: 1) медленно, 2) у строки в этом формате нет смысла. Некоторые команды занимают больше одной строки, тогда как другие могут быть помещены по нескольку на одну строку. Весь процесс должен быть максимально быстрым и писать можно только на C#.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
ivashkanet
Дата 13.7.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 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
PM MAIL WWW ICQ   Вверх
nerezus
Дата 13.7.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Цитата

размер которых может доходить до 1Гб
 Я бы с такими объемами использовал обычные регекспы, т.к. это, насколько понимаю, всего лишь 2гб оперативки.
Или данная часть программы будет постоянно использоваться?

Цитата

С другой стороны, можно ли этому Регексу дать строку, ну скажем 200Мб? Быстро он ее съест?
 Тогда тебе совсем нечего волноваться.
Сам с гигабайтовыми нормально работал, правда не на C#.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
neutrino
Дата 13.7.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



ivashkanet, Спасибо за совет. Я там вроде кое-что толковое нашел. Надеюсь перформанс мне подойдет.

nerezus
Цитата(nerezus @  13.7.2009,  13:59 Найти цитируемый пост)
 Я бы с такими объемами использовал обычные регекспы, т.к. это, насколько понимаю, всего лишь 2гб оперативки.
Или данная часть программы будет постоянно использоваться?

Проблема в том, что структура, которую я строю занимает офигенно много оперативки. Я даже не думаю о том, чтобы выделять 1Гб только для того, чтобы дать его регексу. Но есть и другие ишьюз:
1) регекс нефига не читабелен. Что будет если завтра придет прогер и захочет немного поменять формат?
2) регекс берет строку, а у меня байт-аррэй

Вот подумываю о каком-нибудь движке грамматик, так, чтобы сама грамматика была понятна. Кстати, на codeproject есть такие примеры.
Очень не хочется изобретать велосипед. 

Можно ли считать большие куски файла в строки (string)?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
nerezus
Дата 13.7.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Цитата

1) регекс нефига не читабелен. Что будет если завтра придет прогер и захочет немного поменять формат?
 Покажи регексп?


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
neutrino
Дата 13.7.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



nerezus, У меня его нет smile Мне было достаточно посмотреть на пример с паттерном для числа с плавающей точкой у которого целая часть могла быть равна нулю или без дробной части.

Завтра закину пример файлика.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Bladerender
Дата 14.7.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



А раз распарсить тот файл что нужно, загнать его в свой определенный формат, как-то проиндексировать и потом СтримРидером его подчитывать и работать с ним?
PM MAIL   Вверх
neutrino
Дата 14.7.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Bladerender, очень долго. Пользователю придется много пить кофе smile


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
jonie
Дата 15.7.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



есть lex, bison и т.п. инструменты.... или даже boost:spirit, правда это все вроде бы c++, но наверно для бизона и лекса есть маппинги и на C# - поройте в ту сторону...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Bladerender
Дата 15.7.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Цитата(neutrino @ 14.7.2009,  14:16)
Bladerender, очень долго. Пользователю придется много пить кофе smile

Ну понятно что это не поможет если каждый раз будет новый файл с данными. А если это статическая база с чем-то то самое оно.
PM MAIL   Вверх
neutrino
Дата 16.7.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Начало файла, для примера выглядит так:
Код

U=MIL X141.803,1616.555Y65.866,1766.078
;;GeneratedBy : Ucam v8.1-070625
;;Hostname : PCRP754
;;User : Administrator
;;Date : Thu Jan 31 17:56:31 2008
;;Digest : d0d4dfc4d7e49f9d8b9fee9aeff481838798dbc9caafefa9b6a3ba
U=MM A46=CIRCLE,0.08 F32.1215,8.032F36.0485,6.526F38.4615,8.502F38.6545,9.556F30.3165,16.262F29.8275,18.022F28.6435,22.337
F27.3125,22.848F31.2725,22.339F29.6675,21.37F28.6445,25.245F31.2715,25.64F32.2175,26.553F27.7585,24.228F29.4905,26.6F15.4245,31.949
F15.9675,36.056F6.3575,32.049F5.6995F6.3535,31.339F5.6995,31.387F7.0875,33.703F6.2895,34.229F6.3615,29.87F5.6955,30.536
F6.1715,33.727F13.6335,32.901F6.3655,30.532F5.6995,29.874F6.9515,34.233F34.2735,6.045F17.7455,19.474F36.1875,7.763F15.4795,5.74
F28.9565,5.643F30.0185,8.562F33.6935,5.318F28.6385,24.665F27.2975,25.357F30.2635,24.663F35.0425,13.628F35.2015,16.405F34.6625,13.628
F34.6135,16.405F19.5285,26.847F30.5985,18.034F27.2595,26.482F19.5285,25.365F28.6435,25.245F31.4365,23.35F32.3165,15.261
F28.1205,7.033F15.7865,8.715F14.4365,13.121F33.4365,6.574F38.5295,9.994F36.5385,10.035F34.4245,10.014F39.8355,12.134F39.9435,11.045
F19.8285,4.849F28.1195,7.532F16.4935,8.167F27.4975,8.13F16.8035,8.783F17.0265,6.693F28.6205,7.033F34.3015,25.989F35.3925,26.44
F31.2615,19.469F31.3155,16.262F16.8045,9.176F27.3875,8.538F18.1125,25.247F19.6405,27.549F16.7725,24.081F40.1395,13.834
F32.4025,33.688F10.9445,22.78F10.4995,21.087F16.1875,19.993F16.7915,25.618F20.2605,24.595F24.5125,33.684F19.7025,27.925
F29.1435,10.034F12.3295,9.13F36.9315,27.807F32.9485,19.97F29.0605,19.148F,18.265F36.6465,25.089F33.0645,20.333F28.7965,17.658
F30.8685,19.412F30.8155,16.261F30.6215,11.531F30.3155,15.261F28.1265,6.518F15.3115,8.63F13.1055,11.763F28.0745,14.568F29.8475,9.955
F30.2935,5.924F37.4835,23.405F33.3645,19.742F37.5355,21.51F33.1495,18.87F8.0865,18.068F11.5115,11.445F16.6065,14.264F27.3345,15.064
F17.7985,14.429F27.2225,14.655F26.7835,15.132F16.6075,14.764F7.5865,21.97F13.1055,12.262F29.2515,9.654F12.6005,9.473F11.7235,7.187
F12.1155,7.929F8.0915,20.07F31.1215,8.032F11.5105,11.06F8.0745,18.935F4.7455,8.043F29.0585,1.713F12.6055,11.267F27.4075,13.473
F16.7685,22.085F20.3065,21.217F11.3045,12.54F18.1925,15.437F29.6205,7.033F16.3045,6.454F36.6125,9.603F41.0205,13.836F8.0315,13.94
F10.9155,12.251F6.8155,14.116F6.7735,18.894F29.3015,8.949F15.1025,13.006F29.6215,7.531F12.7485,8.208F27.2755,4.554F32.5985,5.742
F17.8765,15.718F7.7585,13.651F31.3155,15.762F19.0225,17.838F39.4195,18.431F34.9685,12.494F37.7645,19.276F36.6325,19.702

Это файл векторной графики описывающий черчеж одного из слоев печатной платы. 


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0881 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.