Алгоритм быстрой обработки текста

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Grafs
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 02.03.2008 (Вс) 14:20

Алгоритм быстрой обработки текста

Сообщение Grafs » 02.03.2008 (Вс) 19:07

Есть такой текст:

[Restrict]
Nod=40
TraffPoints=39,40,39
TraffRoads=10,10
Time=
[END-Restrict]

[POLYLINE]
Type=0x1
EndLevel=2
RoadID=58
Data0=(50.46900,30.49562),(50.47145,30.50012),(50.47118,30.50743),(50.47354,30.51049)
Nod1=0,48,0
Nod2=3,47,0
[END]

[POLYLINE]
Type=0x1
EndLevel=2
RoadID=59
Data0=(50.47232,30.48033),(50.47263,30.48692),(50.47328,30.49340),(50.47251,30.49730)
Nodes0=(0,49),(3,50)
[END]

И вот такого текста около 70мб

Требуется найти в этом тексте все выделенные жирным Nod1=0,48,0 и TraffPoints=39,40,39 и перенумеровать эти числа по порядку от заданого числа.

Все что я придумал в VB.NET:
1. Загружаю в переменную файл
2. Прохожу регекспом нахожу и создаю сортированный массив Generic.List с уникальными номерами
3. Разрезаю файл-переменную по 10мб чтобы не ругался на нехватку памяти при изменениях
4. Перебираю массив и регекспом меняю в тексте найденные из массива числа
5. сливаю в файл куски

При таком подходе файл в 70мб обрабатывается в течении 10-12 часов

Может есть какой способ делать это быстрее средствами VB?

asharky
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 22.06.2004 (Вт) 0:39
Откуда: Батоны-ларьки-поребрики...

Re: Алгоритм быстрой обработки текста

Сообщение asharky » 04.03.2008 (Вт) 1:28

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

http://msdn.microsoft.com/library/rus/d ... eTopic.asp - сюда можно сходить для начала.

А вообще можно глянуть код? Иначе совершенно не предметный разговор будет.
В культурной столице проститутки берут книгами...

Grafs
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 02.03.2008 (Вс) 14:20

Сообщение Grafs » 04.03.2008 (Вт) 14:38

Еще раз попробую понятнее объяснить:

Вот полный файл тест:

http://rapidshare.com/files/96746511/karta.zip.html

Это карта в текстовом "Польском формате"
В этой карте есть линии, точки, полигоны.
Линии это секция между [POLYLINE] и [END]
У линий есть узлы по вершинам линий, описывается строкой
Data0=(50.44879,30.48224),(50.45882,30.48638)
где указываются координаты.
Также у линий роутовые узлы для автоматической прокладки маршрута Nod1=0,102,0
Где Nod(номер узла по порядку в блоке)=номер узла по порядку в линии, номер узла по порядку в карте, идентификатор обозначающий внешний узел или нет.
Также есть секция
[Restrict]
Nod=102
TraffPoints=103,102,103
TraffRoads=2,2
Time=
[END-Restrict]
где описываются запреты поворотов для роутового узла. Nod=номер узла для которого описывается правило TraffPoints=номер узла,номер узла,номер узла

При добавлении новой линии в карту и установки роутового узла в ней, узлу назначается уникальный номер по счетчику в карте от наибольшего Nod1=0,102,0. Но если скопировать линию из другой карты и вставить в эту и в узле будет номер намного больше последнего номера фрагментируются.
К примерру было 1,2,3,4,5 добавили 12,13,14 последним номером станет 14!

Так вот задача стоит в том чтобы привести счетчик в порядковый вид 1,2,3,4,5,6,7,8. Тоесть пройтись по всем номерам и переписать их по порядку.
Вот только текста такого от 20-70мб

По шагам:
1. Заливаю файл в переменную
2. Нахожу все номера и создаю массив из них, сортирую
Это происходит довольно быстро!

Дальше:
1. Есть два варианта
1.1. Построчная обработка текста по замене из массива через InStr, Replace и т.д. Замененное сливаем в StringBuilder переменную
1.2. Разбить текст по частям и менять через регекспы и сливаем в строчную переменную

Что посоветуете, что быстрее?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron