И это вопрос самый главный, ибо зачем тогда прога, если она "дергает" древнюю базу!
Вид для печати
Про базу данных я с Вами согласен. При таких объемах она не нужна. Но так удобно писать RA6XTD. Ему это не напряг. Все это уже встроено в среду разработки. А это единственный человек на этой ветке, который пишет реальную программу, а все остальные ее тестируют. Напишите Вы реальный код и выложите его здесь, а мы его попробуем. Только пожалуйста не требуйте скачать 17 метров дистрибутива Perla, и инсталить ее на своем компе. Программа должна быть в виде исполняемого кода и не требовать установки дополнительных библиотек.
Про скрипт я тоже согласен. Давайте предложим хозяевам сайта этот вариант. А лучше предложить уже готовый скрипт, останется только подключить :) А качать можно будет или по FTP или также по HTTP.
По поводу сравнения не понимаю. Вы пробовали? Я уже озвучил свои эксперименты. Если запрос делать раз в секунду, то сайт не затыкается. Если Вы можете чаще, - программу в студию.
И кстати Вы писали, что выложили результаты. Не понял, где смотреть?
ну кроме эктив стейта есть более удобный теперь дистрибутив под винду Strawberry Perl.
Кроме того есть несколько вариантов упаковки скрипта и интерператтора в один исполняемый файл, типа perl2exe, есть продукт от эктив стейт, есть уже в дереве perl PAR нахзывается.
В итоге для голой программы примерно полтора мегабайта экзешник + если будете подключать библиотеки.
Про эксперимент я предлагал сранвить производительность Си и Perl
Она нужна при любых объемах.
Не видел ни одного лога с текстовыми базами данных.
Поиск считанного в память файла и по базе с индексами медленнее в разы.
Даже этот пример это показал.
Вот и продемонстрируйте, пожалуйста, готовый продукт вида "скачал-запустил" для сравнения. Скорости в том числе.
Я не говорю, что нельзя сделать лучше, быстрее. Можно. Просто сделать и говорить, что можно сделать - это не одно и тоже. И выказывание недоумения, в частности, по поводу использования базы данных, рассказы про возможности перла, регулярных выражений и т.п. при отсутствии более быстрого, удобного и т.д. варианта ничего кроме улыбки не вызывает.
RA6XTD
Посмотрите на xlog
Продукт, ну чтоже, сейчас сделаем после ужина
Не знаю, у меня летает. Даже без оптимизации. Узнаю размер файла. Резервирую размер памяти. Качаю туда файл целиком. Сишные функции со по работе со строками просто летают. Только нельзя промежуточные результаты выводить в разные окна. Тормозит жутко. Надо выводить сразу результат.
Очень справедливо. Давно ждем.
Не в бровь, а в глаз.
А вот это уже интересно. :)
Добавлено через 8 минут
Не может грамотно составленный код на Си проиграть какому либо другому коду.
Другое дело что не все могут грамотно составлять. И ошибаются часто. Поэтому и изобретаются различные языки, что бы кодер не путался и мог собрать все свои мысли и не растерять их. Для больших трудоемких процессов это большой выигрыш. Поскольку трудно держать весь проект в голове. Но для данной задачи, она не такая сложная, Си нету конкурента.
К сожалению нынешней молодежи, начинающей программировать, это очень сложно объяснить...
Мы не хотим смотреть никакой xlog. Мы хотим увидеть Вашу программу. Одним испольняемым файлом. Без необходимости установки 250 мег Dot Net и т.п.
С удовольствием сравним ее с программой RA6XDT.
Добавлено через 1 минуту
Сейчас получил ответ от Романа RX3RC - обещал выкладывать у себя на сайте базу в текстовом формате. Собственно вот и решение проблемы!
Прошу прощенья за задержку, были гости.
В общем накидал по быстрому
кидаем в папку in файлы, забираем из папки out
Попросим RX9TX и у кого linux стоит на борту протестировать, а я сейчас со стола уберу и поищу чем запаковать для windows.
Вот весь исходник по объему.
sub convert ()
{
$time=localtime();
print "start convert $file \n started in $time \n";
open(ADIFFILE, "< ./in/$file") or die "can't open adif-file";
open(NEWADIFFILE, "> ./out/$file") or die "can't create adif-file";
while($line=<ADIFFILE>)
{
if($line=~m/\<CALL\:/)
{
$b=$`;
$ser=$&;
$after=$';
$num=substr $',0,2;
$num1=substr $num,1,1;
if($num1 eq "\>"){$num=substr $num, 0,1;$call=substr $',2,$num;}
else{$call=substr $',3,$num;};
$rda="";
foreach $i (@table)
{
if($i=~m/\"$call\"/){$rda=substr $',2,5;};
};
$qt=substr $rda,0,2;
#print $call," ",$rda,"\n";
if(!($rda eq ""))
{
$string=join "",$b,$ser,$num,">",$call," ","<STATE:2>$qt <CNTY:5>$rda ",$after;
$line=$string;
}
#print NEWADIFFILE $line;
}
print NEWADIFFILE $line;
};
close ADIFFILE;
close NEWADIFFILE;
$time=localtime();
print "stop convert $file \n stoped in $time \n";
};
open(CSVFILE, "< ./table/rda.csv") or die "can't open csv-file";
@table=<CSVFILE>;
close CSVFILE;
opendir(INDIR, "./in/") or die "can't open ./in directory";
while ($file = readdir(INDIR))
{
if ($file=~m/.+\.adi/){&convert;};
};
closedir INDIR;
Тьфу ты, с екзешником провозился в первый раз больше чем с исходником ))
В общем протестите, должно работать.
по вопросам Да, нет базы у меня и ничего не индексируется, да этот вариант медленнее, но скорость работы достаточна.
Нет проверки вижу, щас подправлю.
по третьему немного не понял, если не находится данных о RDA оно вообще никуда не пишется ничего.
В общем PAR умеет только для своей платформы собирать, винды нету у меня, поэтому собрано при помощи perl2exe/
Протестируйте pls работает или нет.
Прошу прощенья, в той программе косячек, не вычистил в одном месте
Вот исправленный вариант.
Заодно и немного оптимизированный.
Основная потеря времени - на просмотре таблицы регулярными выражениями, которые еще и пересобирались, поскольку в них переменные стояли. Теперь используется хешь массив, отличие которого от обычного массива в том, что данным присвоены не порядковые номера, а собственные имена. Такой тип данных и в паскале кстати есть насколько помню.
Теперь работает на несколько десятичных порядков быстрее, уже можно сравнивать скорости.
И господа, отпишитесь уже, работает сборка под винду или нет.
Меньше сотни строк вся программа.
В архиве и сборка под винду и сам .pl файл под никсы и для тех у кого установлен perl
#!/usr/bin/perl -w
#copyright Sergeyev Roman, RN9RQ ex RA9QCE, 2009
#licence: GPL v3 or later, see more on gnu.org
# Скрипт вписывает данные в adif формат о регионе и RDA районе.
# Кидаем в папку IN файл с названием adif.adi запускаем скрипт и забираем готовый файл из папки OUT
# в папке table лежит набор данных с сайта http://rdaward.org/ в формате csv
sub convert ()
{
$time=localtime();
print "start convert $file \n started in $time \n";
open(ADIFFILE, "< ./in/$file") or die "can't open adif-file";
open(NEWADIFFILE, "> ./out/$file") or die "can't create adif-file";
while($line=<ADIFFILE>)
{
if($line=~m/\<CALL\:/o)
{
$b=$`;
$ser=$&;
$after=$';
$num=substr $',0,2;
$num1=substr $num,1,1;
if($num1 eq "\>"){$num=substr $num, 0,1;$call=substr $',2,$num;}
else{$call=substr $',3,$num;};
$rda="";
if((($call=~m/^R.+/o)||($call=~m/^U[A-Ia-i].+/o))&&(!($after=~m/\<CNTY\:5/o)))
{
if(exists($hash{$call}))
{
$rda=$hash{$call};
$qt=substr $rda,0,2;
$after=~s/^$num\>$call//;
$string=join "",$b,$ser,$num,">",$call," ","<STATE:2>$qt <CNTY:5>$rda",$after;
$line=$string;
};
};
};
print NEWADIFFILE $line;
};
close ADIFFILE;
close NEWADIFFILE;
$time=localtime();
print "stop convert $file \n stoped in $time \n";
};
$time=localtime();
print "program start in $time \n";
open(CSVFILE, "< ./table/rda.csv") or die "can't open csv-file";
@table=<CSVFILE>;
close CSVFILE;
%hash = ();
foreach $i (@table)
{
$i=~s/"//g;
if($i=~m/\,/)
{
$hcall=$`;
$hrda=substr $',0,5;
$hash{$hcall} = $hrda;
};
};
opendir(INDIR, "./in/") or die "can't open ./in directory";
while ($file = readdir(INDIR))
{
if ($file=~m/.+\.adi/){&convert;};
};
closedir INDIR;
На выходе файла нет.
n2wz@n2wz-laptop:~/temp/adif-rda$ ./start.pl
program start in Wed Jul 15 13:47:57 2009