Поиск и замена в огромном файле

G
На сайте с 03.02.2012
Offline
56
1892

Есть огромный xml файл (около 800мб) с данными о товарах. У товаров изменились категории. Есть файл в формате json с данными о старых и новых категориях. Категорий около 10к. Нужно сделать скрипт и программку который будет в xml файле заменять старые айди категорий на новые. На чем лучше делать PHP, C++, Delphi? Какой максимальный размер массивов в данных языках? Посоветуйте как правильно реализовать алгоритм поиска и замены, чтобы весь объем обрабатывался максимально быстро.

ДП
На сайте с 23.11.2009
Offline
203
#1

Если операция разовая - то лучше делайте на том, на чем умеете.

Для того же php есть XMLReader - класс для потоковой обработки больших xml-файлов. Т.е. он не будет пытаться запихнуть весь файл в память, а позволяет обрабатывать его поэлементно.

http://php.net/manual/ru/class.xmlreader.php

DV
На сайте с 01.05.2010
Offline
644
#2

Я бы для начала попробовал на Bourne Shell.

cat, sed, awk.

Если для вас родная среда Windows, и нужно побыстрее, EmEditor может кушать очень большие файлы, при этом, работает с регулярками и поддерживает макросы.

Оказалось, что и в *nix под wine он так же замечательно работает.

На ru-board есть лекарство :) Это, конечно, опупеть для русского человека — за продвинутый блокнот платить 6,752.36 RUB.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
PN
На сайте с 22.08.2012
Offline
103
#3
Gavich:
Есть огромный xml файл (около 800мб) с данными о товарах. У товаров изменились категории. Есть файл в формате json с данными о старых и новых категориях. Категорий около 10к. Нужно сделать скрипт и программку который будет в xml файле заменять старые айди категорий на новые. На чем лучше делать PHP, C++, Delphi? Какой максимальный размер массивов в данных языках? Посоветуйте как правильно реализовать алгоритм поиска и замены, чтобы весь объем обрабатывался максимально быстро.

вы собираетесь делать массив 800 Мб? Я думаю можно обрабатывать построчно, не загружая сразу весь файл, тогда любой язык подойдет.

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
SeVlad
На сайте с 03.11.2008
Offline
1609
#4
proksey-net:
Я думаю можно обрабатывать построчно

хмл? :)

АПД. Хотя да, зависит от того где и как встречаются заменяемые данные.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
DV
На сайте с 01.05.2010
Offline
644
#5

Кстати, если будете пробовать php, думаю, что переработать большой файл проблемы не будет, если читать построчно и писать на выход в каждой итерации. Зажирать всё сразу в память совсем необязательно.

[Удален]
#6

800 мб, можно и в память загрузить на любом языке. Ограничения лишь в объеме оперативки. Я бы на python сделал, там делов то вероятно не много. А для работы с файлами язык большого значения не играет, тут важнее доступные для языка библиотеки (работа с json, xml ). Парсить построчно и регулярками xml или json файл - это полнейший изврат (конечно если это не разовая операция), т.к. в следующий раз весь файл может придти в одну строку с другим порядком значений.

PN
На сайте с 22.08.2012
Offline
103
#7
imagine:
800 мб, можно и в память загрузить на любом языке. Ограничения лишь в объеме оперативки. Я бы на python сделал, там делов то вероятно не много. А для работы с файлами язык большого значения не играет, тут важнее доступные для языка библиотеки (работа с json, xml ). Парсить построчно и регулярками xml или json файл - это полнейший изврат (конечно если это не разовая операция), т.к. в следующий раз весь файл может придти в одну строку с другим порядком значений.

будет в одну строку - можно считывать по 32 байта:)

[Удален]
#8
proksey-net:
будет в одну строку - можно считывать по 32 байта

а значение ключа будет в 64 :)) или на границе блоков (часть в одном, часть в другом) и т.п. изврат же, проверено.

PN
На сайте с 22.08.2012
Offline
103
#9
imagine:
а значение ключа будет в 64 :)) или на границе блоков (часть в одном, часть в другом) и т.п. изврат же, проверено.

может быть, но если файл будет 500 Гб, будете считывать все равно блоками хоть по 800 мб, но блоками🍿

R
На сайте с 17.02.2013
Offline
37
#10

да любой язык, кому что ближе. однажды самому доводилось хмл через data load infile в sql пихать и уже там обрабатывать.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий