Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Парсинг большого XML |
Автор: Error202 16.2.2012, 13:43 |
Есть 4 файла XML по 2Гб каждый... На сервере 1Гб памяти... Чем и как можно обработать файл такого размера? |
Автор: infarch 16.2.2012, 14:35 |
Читать и парсить на лету, не сохраняя в памяти весь документ. Или перестать быть извращенцем и пользоваться базами данных. |
Автор: Error202 16.2.2012, 14:44 |
Да яб легко... с филиального сервера такие идут и сделать ничего нельзя... |
Автор: bvn13 16.2.2012, 15:19 | ||
ну... я бы тогда порекомендовал 1с... |
Автор: arto 16.2.2012, 15:49 |
а как обработать? хинт: rm -f * тоже обработка |
Автор: Error202 16.2.2012, 16:26 |
Пропарсить... Вроде как наладил через XML::Twig, но проблема... где-то косяк синтаксиса... :( Половина проходит и стопор... Можно как-то пропускать ошибки при парсинге? |
Автор: Turos 22.2.2012, 18:32 |
Считывать по кусочкам без хранения в памяти, составляя хеш "позиция узла" => "позиция байта в файле", и потом подчитывать данные по позиции --------------------- https://www.allmetals.ru/metals/germanium/ |
Автор: Pilat66 23.2.2012, 03:16 |
есть же два подхода к разбору XML - прочитать как огромную сруктуру в память, и читать постепенно, получая обратные вызовы на каждый элемент. Второй способ хоть терабайтные файлы пропарсит. |
Автор: yazu 23.2.2012, 05:45 |
Зависит для чего парсить? Любая нетривиальная обработка 2ГБ файла (не важно XML, нет) на 1Гб машине может легко привести к практически нерешаемой задаче - поиск дубликатов, к примеру. А тривиальная - выборка чего-либо и суммирование, к примеру, вполне может быть выполнена регулярными выражениями. Очень хорошее введение об обработке нтмл (принципы одинаковы) есть в свободной книжке Perl & LWP. ЗЫ Книга была в свободном доступе с гаденьким замечанием, что мол, все равно на вшивых русских хакерских серверах висит, поэтому мол читайте у меня - конкретно сейчас сервер недоступен, так что надо искать на этих самых серверах ![]() |