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 есть ограничение на размер массива?
Решение не самое красивое, но как обычно решают такие проблемы? Может есть более красивый способ конвертации?
 
ууу блин

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 зачастую трудновато реализовать
 
А зачем логика и валидация - когда задача
большой файл положить в mysql.... не понимаю зачем тут DOM приплели....
 
Автор оригинала: 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 и делается возможность общей статистики и поиска
 
знает она про 1251

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

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

-~{}~ 05.10.05 09:00:

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