XML файлы большого объема в win-1251

  • Автор темы TheRabbit
  • Дата начала

TheRabbit

Guest
XML файлы большого объема в win-1251

Ситуация такая - специальная прога под виндами создает XML файл (в кодировке win1251) и отсылает его на FTP хостинга. Проблема в том, что файл XML в win1251, а скрипту нужен UTF-8, т.е. файл надо переконвертировать. На хостинге стоит скрипр PHP4 и его задача прочитать этот XML файл и выдернуть все данные из него в базу mysql. Все это реализованно и работает, но проблема с файлами большого объема - вылетают ошибки.
Вот самое узкое место:
PHP:
$XML_File_Name = 'data/file.xml';
// Проверяем существование файла
if (file_exists($XML_File_Name)){ // Файл существует
	// Открываем XML файл
	// Считываем весь файл в массив
	$File_Array = file($XML_File_Name);
	$Temp_Str = '';
	// Делаем перекодировку
	for ($i = 0; $i < sizeof($File_Array); $i++) 
		$Temp_Str.= iconv('windows-1251', 'utf-8', $File_Array[$i]);
	
	
	// Открываем XML файл
	$dom1 = domxml_open_mem($Temp_Str);
	// Если ошибок нет - значит работаем
	if ($dom1) {
		// Узнаем корневой элемент
		$root = $dom1->document_element();
		// Массив дочерних элементов корневого
		$root_child = $root->child_nodes();
Размер XML файла - 32 мега
Ошибка вылетает на iconv, разве в PHP есть ограничение на размер массива?
Решение не самое красивое, но как обычно решают такие проблемы? Может есть более красивый способ конвертации?
 

slach

Новичок
ууу блин

1) cначала грузить 32 метра в массив
2) потом конкатенировать елементы в строку

пипец =) на месте вашего работадателя я бы вас уволил =)

3) накой БОЛТ вообще... делать перекодировку???
да еще так криво?

про http://php.net/manual/en/function.domxml-open-file.php слышали???

4) потом еще ее открывать в DOM весь файл

в DOM грузить файл в 32 метра
это разом отжирать метров 60 памяти...

вы про
SAX парсинг слышали??
http://php.net/manual/en/function.xml-set-object.php
посмотрите пример реализации

память отжирать вам не придется
читать будет значительно быстрее

хотя конечно логику и валидацию через SAX зачастую трудновато реализовать
 

BeGe

Вождь Апачей, блин (c)
А зачем логика и валидация - когда задача
большой файл положить в mysql.... не понимаю зачем тут DOM приплели....
 

TheRabbit

Guest
Автор оригинала: slach
ууу блин

1) cначала грузить 32 метра в массив
2) потом конкатенировать елементы в строку

пипец =) на месте вашего работадателя я бы вас уволил =)

3) накой БОЛТ вообще... делать перекодировку???
да еще так криво?

про http://php.net/manual/en/function.domxml-open-file.php слышали???

4) потом еще ее открывать в DOM весь файл

в DOM грузить файл в 32 метра
это разом отжирать метров 60 памяти...

вы про
SAX парсинг слышали??
http://php.net/manual/en/function.xml-set-object.php
посмотрите пример реализации

память отжирать вам не придется
читать будет значительно быстрее

хотя конечно логику и валидацию через SAX зачастую трудновато реализовать
1) это мой первый опыт с XML, поэтому не прошу судить строго
3) domxml-open-file - пробовал в первоначальном варианте. Но в файле содержаться русские символы и сам файл в win1251, и функция начинает кричать что такую кодировку не знает и знать не хочет, а хочет она UTF-8.
4) SAX парсинг - слышал. Не грузит файл целиком в память, а использует ту часть что нужна. Похоже что надо попробовать.

А он win1251 понимает? не будет ругаться на русские символы?

-~{}~ 03.10.05 11:39:

Автор оригинала: BeGe
А зачем логика и валидация - когда задача
большой файл положить в mysql.... не понимаю зачем тут DOM приплели....
На FTP закачивается грубо говоря статистика из разных мест, все собирается в mysql и делается возможность общей статистики и поиска
 

slach

Новичок
знает она про 1251

вы iconv включите !! тогда возможно dom_open_file нормально 1251 начнет читать
 

TheRabbit

Guest
Автор оригинала: slach
знает она про 1251

вы iconv включите !! тогда возможно dom_open_file нормально 1251 начнет читать
тогда русская кодировка летит к чертям..

-~{}~ 05.10.05 09:00:

Проблему решил - очень просто: сделал чтение из файла построчно; т.к. формат моего файла постояннен, то написал свой парсер XML под мой формат, на базе обычных строковых функций. Теперь скрипт работает раз 5 быстрее и проглатывает даже 50 меговые файлы
 
Сверху