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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разделение 
V
    Опции темы
gcc
Дата 22.1.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



есть файл

Код

qq1\tuu1\x0Aqq2\tuu2\x0Aqq3\tuu3\x0A


как мне сделать хєши?

Код

open F, "parse.txt" or die "can open: $!\n"; @data=<F>; close F;

for $loopindex (O..$#data) {
  for $element(split '$\x0A', $data[$loopindex]){
    ($key, $value) = split '\t', $element;

    $array[$loopindex]{$key} = $value;
  }
  }
use Data::Dumper;
  
  print Dumper(@array);



вывод

Код

$VAR1 = {
          'qq1\\tuu1\\x0Aqq2\\tuu2\\x0Aqq3\\tuu3\\x0A' => undef
        };


PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 22.1.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



фай подправил

сделал не бинарный

Код

qq1 uu1
qq2 uu2
qq3 uu3


хотя не знаю...может быть файл такой как я написал в первом посте

так работает

Код


  for $element(split '\0xa', $data[$loopindex]){
    ($key, $value) = split ' ', $element;



можите подсказать еще пожалуйста:

при бинарном поиске в таком файле, по ключю найти значение, только такой файл занимает 20Гбт, нужно использовать массив хєшей или через свзяку встроенных функций seek, rindex, index, read, tell?

Это сообщение отредактировал(а) gcc - 22.1.2009, 13:41
PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 22.1.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



gcc, на больших файлах нельзя делать @data=<F>; -- памяти может не хватить, да и медленнее это, чем while (<F>) {push @data, $_} (если все же нужно зачитать файл целиком).

Насколько я вижу -- у Вас обычный текстовый файл. Зачем с ним обращаться, как с бинарным?

Хэш или массив хэшей из файла размером 20Гбт -- памяти может не хватить (если только ключи не будут часто повторяться). Если нужно многократно искать по ключу найти значение (из одного и того же файла),
то лучший выход, наверное, создать хэш, связанный со специальным дисковым файлом (модули для этого есть). Тогда создание хэша потребует много времени (и диска), зато поиск значений по ключам будет сравнительно быстр.
PM MAIL   Вверх
gcc
Дата 22.1.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



amg, сказали нужно сделать "бинарный поиск" можно ли тут сделать?

это реализуемо? тут нужен массив или не объязательно?

PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 22.1.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



gcc, может вы про какой-то другой "бинарный поиск" подумали? Вообще это алгоритм.

Это сообщение отредактировал(а) KSURi - 22.1.2009, 14:45


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 22.1.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



именно про этот поиск он будет работать? там массив, а тут можно? тогда не массив? и нужно чтобы было не более 10 сек.

Это сообщение отредактировал(а) gcc - 22.1.2009, 14:50
PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 22.1.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(gcc @  22.1.2009,  14:21 Найти цитируемый пост)
нужно сделать "бинарный поиск"
Что означает "бинарный поиск"? Значений по ключам? Если пары ключ-значение разделены символом "\0xa", а ключ и значение -- символом "\t" (как в вашем примере), то с таким файлом можно обращаться как с текстовым. 
Код
open F, "parse.txt" or die "can open: $!\n"; @data=<F>; 
while (<F>) {
  push @array, {split /\t/};
}
close F;
 (Вроде, такой массив хэшей Вы хотели сделать? Если да, то какой в нем толк?)
PM MAIL   Вверх
gcc
Дата 22.1.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



я не знаю что это значит, но данные не в MySQL
по ссылке которую написал, Уважаемый KSURi, написано, оно быстрее должно быть? можно ли быстрый поиск сделать по такому файлу или нет?




PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 22.1.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(gcc @  22.1.2009,  15:10 Найти цитируемый пост)
можно ли быстрый поиск сделать по такому файлу или нет?
Именно по файлу -- нет. Скорость современных жестких дисков -- до 100 Мбт/с, 20Гбт -- 200 с (если не супер-рейд какой-нибудь).

Можно пробовать создать БД (тот же MySQL, или tie %hash, 'DB_File'). Создание базы -- долго, зато поиск будет быстр. 

Если же поиск нужно вести каждый раз в новом 20Гбт файле, то, IMHO, в 10 с никак не уложиться.
PM MAIL   Вверх
gcc
Дата 22.1.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



но вот мне сказали что такой код работает, только я не знаю какой файл на самом деле с какми разделителями, и что за 1Гбт - 1 сек. выполняется

я запускаю у меня ничего нету выводиться, т оесть значения - нету

Код

#!/usr/bin/perl -w

my $read_block_size = 256;

sub rec_shift {
    my ( $file, $dir ) = @_;
    my ( $buf, $ofs );
    while (1) {
        $ofs = tell($file);
        if ( !$dir ) {
            read( $file, $buf, $read_block_size );
            my $o = index( $buf, "\x0a" );
            if ( $o >= 0 ) {
                seek( $file, $ofs + $o + 1, 0 );
                return;
            }
            elsif ( eof($file) ) {
                return;
            }
        }
        else {
            my $r = $ofs > $read_block_size ? $read_block_size : $ofs;
            seek( $file, -$r, 1 );
            read( $file, $buf, $r );
            seek( $file, -$r, 1 );
            my $o = rindex( $buf, "\x0a" );
            if ( $o >= 0 ) {
                seek( $file, $o + 1, 1 );
                return;
            }
            elsif ( $r == $ofs ) {
                seek( $file, 0, 0 );
                return;
            }
        }
    }
}

sub rec_read {
    my ($file) = @_;
    my $ln = '';
    my $buf;
    while (1) {
        my $ofs = tell($file);
        read( $file, $buf, $read_block_size );
        my $o = index( $buf, "\x0a" );
        if ( $o >= 0 ) {
            seek( $file, $ofs + $o + 1, 0 );
            $ln .= substr( $buf, 0, $o );
            return split( /\t/, $ln );
        }
        $ln .= $buf;
    }
}

sub filebinsearch {
    my ( $file, $fkey, $beg, $end ) = @_;
    return undef if $beg == $end;
    my $oc = int( ( $beg + $end ) / 2 );    # ( $beg + $end ) >> 1 -- 32bit :-(
    seek( $file, $oc, 0 );
    rec_shift( $file, 1 );
    $oc = tell($file);
    my ( $key, $value ) = rec_read($file);
    return $value if $key eq $fkey;

    if ( $key lt $fkey ) {
        filebinsearch( $file, $fkey, tell($file), $end );
    }
    else {
        filebinsearch( $file, $fkey, $beg, $oc );
    }
}

sub findinfile {
    my ( $filename, $key ) = @_;
    my $value    = undef;
    my $filesize = 0;
    return undef if !-f $filename;
    return undef if !-r $filename;
    return undef if !( $filesize = -s $filename );
    return undef if !open( $file, '<', $filename );
    return filebinsearch( $file, $key, 0, $filesize );
}
print findinfile( $ARGV[0], $ARGV[1] ) . "\n";


Это сообщение отредактировал(а) gcc - 25.1.2009, 20:46
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 22.1.2009, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



gcc, 1Гбт - 1 сек. возможно только при чтении из памяти, с диска таких скоростей чтения еще нет в свободном доступе  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
  Дата 22.1.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



ginnie, на этом форуме обсуждалось что это можно сделать, ссылку не помню - сейчас поищу

а в этом скрите что я привел, как его запустить какой формат данный в текстовом файле? а то я понять не омгу, не работает скрипт

Добавлено @ 17:07
может быть не 1, а 2

Добавлено через 4 минуты и 6 секунд
вот

http://forum.vingrad.ru/forum/topic-241552.html

Это сообщение отредактировал(а) gcc - 22.1.2009, 17:08
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 22.1.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



gcc, по указанной ссылке обрабатываемый файл содержит упорядоченные по ключам данные. У Вас также? Там просто читаются не все данные, а лишь часть, поэтому возможно обработать большой файл за небольшое время.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 22.1.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



да, именно так

Код

qq1\tuu1\x0Aqq2\tuu2\x0Aqq3\tuu3\x0A


Добавлено через 1 минуту и 45 секунд
только скорее всего так правильней

Код

qq1 uu1
qq2 uu2
qq3 uu3


\t - это табулятор
\x0A - абзац
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 22.1.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



gcc, в указанном примере формат обрабатываемого файла такой-же как у Вас.

запускается script.pl filename key

если не находит ключ, добавьте в функцию filebinsearch() строчку

Код

print "check key $key$/";


перед

Код

return $value if $key eq $fkey;


и проанализируйте вывод


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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