1

Тема: VBA: Ограничения на работу с регулярными выражениями RegExp

Столкнулся с проблемой, оказывается объект RegExp (точнее его методы) имеют ограничения на размер обрабатываемых данных, не замечал до тех пор, пока на обработку не попал ХМЛ файл размером 120 мегабайт.

Не нашел в сети параметров ограничения и обращаюсь к сообществу за подсказкой. Важно то, что не желательно разбивать обрабатываемый файл на куски меньшего размера.

Для примера немного кода и выдаваемых ошибок здесь в переменной strzap живет 120 млн букв и цифр ))


Dim myRegExp As New RegExp 
Dim aMatch As Match 
Dim colMatches As MatchCollection 
myRegExp.Multiline = True 
myRegExp.Global = True 
myRegExp.IgnoreCase = True 

myRegExp.Pattern = "\r\n" 
strt = myRegExp.Replace(strzap, "")
strzap = strt

Выдает ошибку "Out of memory".


myRegExp.Pattern = "<ZAP>(.*?)</ZAP>"
Set colMatches = myRegExp.Execute(strzap) 
For Each aMatch In colMatches 
    strNZap = aMatch.SubMatches(0)
    ...
Next aMatch

Цикл не выполняется, поскольку коллекция получается пустой. хотя реально такие теги есть причем их несколько десятков тысяч.

2

Re: VBA: Ограничения на работу с регулярными выражениями RegExp

mihmed, что мешает сделать правильный выбор в сторону использования банального разбора xml?

3 (изменено: mihmed, 2013-10-25 07:34:51)

Re: VBA: Ограничения на работу с регулярными выражениями RegExp

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

Впрочем это дело вкуса. Мне же хочется прочитать про ограничения на работу с регулярными выражениями в VBA, например для того, чтобы будущие задачи сразу ограничивать в механизме реализации.
Можно конечно провести ряд экспериментов, сначала обрезать хмл до 60 мегабайт, не проглотит урезать до 30 и т.д., но этот эксперимент нельзя будет считать полностью точным, поскольку возможно влияние характеристик конкретного компьютера и нельзя будет опираться на такой эксперимент при передаче готовой программы заказчику или коллегам/друзьям

4

Re: VBA: Ограничения на работу с регулярными выражениями RegExp

mihmed пишет:

Выдает ошибку "Out of memory".

mihmed пишет:

поскольку возможно влияние характеристик конкретного компьютера

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

Забыл пароль и потерял e-mail.

5

Re: VBA: Ограничения на работу с регулярными выражениями RegExp

Стандартный импорт мне показался менее эффективным по сравнению с разбором с помощью регулярных выражений, он гораздо более медленный и имеет еще ряд неудобств.

mihmed, выбор за Вами. Каких неудобств?

Кроме того у меня за один раз может последовательно обрабатываться несколько десятков хмл и мне показалось плохим решением раскладывать хмл во временные таблицы и дальнейшим сваливанием всего в одну кучу, при этом надо еще маркировать принятые данные что бы в общей массе понимать какие данные из какой хмл прилетели.

Поясните конкретнее. Мне абсолютно непонятна Ваша методика.

сначала обрезать хмл до 60 мегабайт, не проглотит урезать до 30 и т.д.,

+ открыть спойлер

А потом обрезка придётся в аккурат посредине потребного тэга. То-то будет радости.

6

Re: VBA: Ограничения на работу с регулярными выражениями RegExp

alexii пишет:

mihmed, выбор за Вами. Каких неудобств?

Ну первое неудобство, стандартный импорт не позволяет мне делать импорт в существующую таблицу (?), кроме того в зависимости от таблицы мне необходимо добавлять ряд стандартных полей которые зависят, в том числе от, содержимого внутри тега.
Это конечно можно обойти, но длинно и за существенно большее время.

alexii пишет:

Поясните конкретнее. Мне абсолютно непонятна Ваша методика.

Условно внутри тега есть некий тег, который имеет в себе признаки отношения к разным организациям, причем представленный в текстовом виде. Мне достаточно просто "вычленить" содержимое тега и, сразу обработав его, занести итоговую таблицу уже идентификатором из связанной таблицы.
При этом вся обработка производится за один проход, что не реально при варианте импорт+обработка

+ открыть спойлер

А потом обрезка придётся в аккурат посредине потребного тэга. То-то будет радости.

+ открыть спойлер

Ну так обрезка только для понимания максимального размера обрабатываемых данных ))

7

Re: VBA: Ограничения на работу с регулярными выражениями RegExp

shiz пишет:

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

У меня 4 на борту. Дело не в этом, дело в том, что не верно рассчитывать на то, что конечный потребитель будет иметь такие же параметры компьютера.
Потому и ищу информацию по ограничениям.

8

Re: VBA: Ограничения на работу с регулярными выражениями RegExp

А ты смотрел сколько в памяти занимает загруженый XML?

У меня когда-то коллега делал выгрузку из одной ЕРП системы в 1С. Я ужаснулся когда увидел что файл который получается на выходе 30 МБ имеет размер в памяти при обработке 2,5ГБ. Я конечно потом переделал процедуру и полечил распухание но тем не менее осадочек остался..