2008-11-05 8 views
8

Potrzebuję zaleceń dotyczących tego, co używać w Delphi (używam Delphi 2009) do obsługi bardzo dużych plików XML (na przykład 100 MB) tak szybko, jak to możliwe.Najszybsza możliwa obsługa XML w Delphi dla bardzo dużych dokumentów

Potrzebuję wprowadzić dane XML, uzyskać do nich dostęp i zaktualizować dane z mojego programu, a następnie wyeksportować zmodyfikowany plik XML ponownie.

Mam nadzieję, że dane wejściowe i wyjściowe można wykonać w ciągu kilku sekund na szybkim komputerze z systemem Windows.


Wyjaśnienie. Oczekuję, że będę musiał używać DOM, ponieważ dostęp do struktury danych do tworzenia raportów i aktualizacji danych jest ważny i potrzebuję tej funkcji, aby była bardzo szybka.

Dane wejściowe są wykonywane tylko jeden raz w przypadku ładowania pliku, a dane wyjściowe tylko w przypadku zapisywania pliku, zwykle tylko jeden raz przy wyjściu. Powinny one być szybkie, ale nie są tak ważne jak dostęp do danych w pamięci i ich aktualizacja.

Rozumiem, że parsery stron trzecich pomagają tylko przy wprowadzaniu i wyprowadzaniu, ale nie w korzystaniu i modyfikowaniu danych po załadowaniu do pamięci. Czy też się mylę?

Odpowiedz

8

Jeśli dobrze zrozumiałem twoje pytanie, znasz strukturę danych i modyfikujesz dane - a nie strukturę pliku XML.

Pod tymi warunkami i jeśli wydajność jest kluczowa, możesz spróbować z bezpośrednią manipulacją tekstem - pomiń parsowanie XML.

Odczytuj ze strumienia, użyj algorytmu szybkiego wyszukiwania tekstu, np. Boyer-Moore, aby znaleźć miejsca, w których musisz zmodyfikować dane, wykonaj modyfikację i dane wyjściowe w innym strumieniu.

To byłby przebieg jednoprzejściowy, brak analizy XML, brak wbudowanego drzewa XML w pamięci.

+0

Właściwie, kiedy program się uruchamia, chcę wprowadzić dane do struktury danych w pamięci. Wtedy, gdy jest uruchomiony, będę uzyskiwał dostęp do tych danych wiele razy dla różnych operacji, w tym pozwalając użytkownikowi na aktualizację danych. Po zamknięciu użytkownik prawdopodobnie będzie chciał zapisać swoje aktualizacje. – lkessler

+0

... ale skończyło się na tym, że zaleciłeś bezpośrednią manipulację tekstem, która z pewnością jest tak szybka, jak tylko możesz. Więc podaję ci zaakceptowaną odpowiedź. – lkessler

+0

@lkessler: Czy możesz się podzielić? – menjaraz

2

Nie jestem specjalistą, ale uważam, że konsensus jest, że parser SAX będzie znacznie bardziej wydajne niż DOM ...

3

Czasami warto spojrzeć na DIHtmlParser component from The Delphi Inspiration. Ma być "niezwykle szybki, szczególnie podczas analizowania dużych plików", a "na nowoczesnych komputerach wynik dochodzi do ponad 15 MB danych HTML na sekundę". Miałem z tym całkiem dobre doświadczenia, chociaż nigdy nie próbowałem tego z ogromnymi plikami.

+0

Użyłem tego w bardzo dużych (> 100 MB) plikach dziennika XHTML bez żadnych problemów. – skamradt

5

Warto rozważyć SAX zamiast parsera DOM.

Z DOM płacisz za załadowanie dokumentu, ale po wczytaniu danych można uzyskać do nich szybki dostęp.

Używając SAX, musisz pisać programy obsługi dla elementu początkowego, elementu końcowego itd., Ale masz dużo większą elastyczność w tym, co robisz.

Chociaż prawdopodobnie nie pomaga to twojej sytuacji, SAX jest bardzo przydatny podczas wyszukiwania, ponieważ możesz zatrzymać przetwarzanie w dowolnym momencie, więc gdy już znajdziesz to, czego szukasz, możesz przestać.

Jeśli twój program nie musi przeanalizować wszystkich danych, zanim nie będzie wiedział, jakie zmiany wprowadzić, możesz napisać instrukcje SAX, które właśnie zaktualizowały dane po ich odczytaniu i przekazaniu innym, aby przesyłać dane strumieniowo zamiast ładować to wszystko do jakiejkolwiek struktury pamięci. To sprawi, że rozwiązanie będzie bardzo skalowalne, ponieważ nie będziesz miał ograniczeń pamięciowych w przypadku bardzo dużych plików.

Do tego, co warto, używam parserów DOM i SAX MSXML. Można argumentować, że nie są one najlepszymi wynikami, twierdzę, że prawdopodobnie więcej osób pracuje nad ich poprawą, więc będą coraz lepsze.

4

Jestem bardzo zadowolony z NativeXML z SimDesign. Zawiera również specjalną wersję o nazwie FastXML, której jeszcze nie testowałem, ale mówi się, że jest szybka.

1

Jeśli kiedykolwiek rozważysz sposób SAX sterowany zdarzeniami, może Ci się przydać XML Parser library.

0

Inną możliwością, którą właśnie odkryłem, jest zakupiona LMD ElPack package, zawierająca bibliotekę wsparcia XML, która mówi "jest bardzo szybka, w pełni wyposażona w Unicode i dodaje tylko niewielki ślad do plików Exe".

Patrząc na źródło ich jednostki LMDXML.pas zawartej w pakiecie LMD 7 (dla Delphi 2009), napisano, że kod jest oparty na kodzie SimpleXML Release 8.0 (lipiec 2006) autorstwa Michaila Vlasova.

0

Jeśli potrzebujesz tylko bezpośredniej manipulacji, zgadzam się z odpowiedzią przez zendar.

Jeśli chodzi o implementację DOM lub SAX, polecam DIXml.

Powiązane problemy