Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> xbase большой файл dbf ->xml, Чтение файла 120 MB 
:(
    Опции темы
izver84
Дата 20.12.2014, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 302
Регистрация: 5.11.2007

Репутация: нет
Всего: 1



Здравствуйте.

Передо мной  поставлена задача перенос данных  dbf в xml. 
В dbf есть поле datd- дата.
В файл  содержаться данные по нескольким датам.
Задача создать для каждой даты свой  xml.  

Написал прогу.
Код

use DBD::XBase;
use DBI;
use Encode qw /from_to/;
use strict;
use XML::Simple;
#текущая Дата
my $dat="";

my $filename = '3.xml';
my $fh='d.xml';

my $dbh = DBI->connect("DBI:XBase:./", undef, undef, {RaiseError =>1});

my $sth = $dbh->prepare("SELECT datd FROM table order by datd") or die $dbh->errstr;
$sth->execute() or die $sth->errstr;

while ( my $arr = $sth->fetchrow_arrayref ) {
     $arr->[0] = $arr->[0];
    if ($dat!=$arr->[0]){    
    print $arr->[0];            
    my $filename = $arr->[0].'.xml';
open(my $fh, '>:encoding(UTF-8)', $filename) or die "Не могу открыть '$filename' $!";    
print $fh '<table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'."\n";
my $sth2 = $dbh->prepare("SELECT datd,..,nd,kvpr,...,sumfrt FROM tabke  where datd='".$arr->[0]."' order by datd,nd,kvpr") or die $dbh->errstr;

$sth2->execute() or die $sth2->errstr;
while ( my $arr2 = $sth2->fetchrow_arrayref ) {
    $arr2->[0] = $arr2->[0];
     $arr->[1] = $arr2->[1];
   *****
    $arr->[33] = $arr2->[33];             
    print $fh '<row>'."\n";
    print $fh '<datd>';
    Encode::from_to ($arr2->[0], 'cp866', 'utf8');
    print $fh $arr2->[0];
    print $fh '</datd>'."\n";    
    ******    
    print $fh '<sumfrt>';
    Encode::from_to ($arr->[33], 'cp866', 'utf8');
    print $fh $arr->[33];
    print $fh '</sumfrt>'."\n";    
    print $fh '</row>'."\n";
}
print $fh '</table>';    
    }else{
    
    close $fh;
    $dat=$arr->[0];
}
}
print "готово\n";
 
 
Программа работает. Тестил на маленьком файл (4 строки).

Реальный файл долго обрабатывает. 
После часа работы оборвал  процесс.

Можно как то ускорить процесс?
Я не нашел проги которая преобразовала dbf в  xml, 

Спасибо. 


--------------------
Если новая программа с первого раза компилируется без ошибок, значит, она написана принципиально неправильно. 
PM MAIL   Вверх
Loki
Дата 21.12.2014, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Сделайте вывод в переменную из базы и после окончания выгрузки закройте соединение с базой.
А после сделайте вывой из переменной(или массива) в xml файлик.

PM MAIL   Вверх
noize
Дата 23.12.2014, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 10.7.2010
Где: СПб

Репутация: 3
Всего: 3



Делайте запрос с лимитами и крутитесь в цикле увеличивая на каждой итерации лимит и оффсет пропорционально до тех пор пока в БД есть данные.
Пример для mysql:
Код

my $dbh = DBI->connect(...)

my $limit = 100;
my $offset = 0;
open my $xml;
while ( 1 ) {
    my $query = $dbh->prepare("SELECT ... LIMIT $offset,$limit" );
    $query->execute;
    last if $query->row < 1;
    # ... тут разбираем полученные данные
    $limit += 100;
    $offset += 100;
}


Это поможет сохранить память и ускорит(порой ускорение до нескольких раз) работу скрипта т.к. данные получаются порциями и база становится более отзывчивой. 
PM MAIL   Вверх
tzirechnoy
Дата 24.12.2014, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



Естественно, это всё будут гадания на кофейной гуще, но 99% -- что проблема в ORDER. То есть, скорее всего, у драйвера dbf какой-нибудь тупейшый сортировщик с квадратичным временем исполнения.

Перегоните всё в нормальню базу (sqlite хотя бы), с правильным индэксом -- и будет быстрее.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.