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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение и запись в файл, проблема буферизации??? 
V
    Опции темы
burakov
Дата 12.11.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день, работаю под Windows
Есть код, который читает из одного файла и пишет во второй
он такой хитрый smile, потому как немного изменил и можно контролировать размер второго файла
(ну и вообщем читать мне нужно было построчно - строки разной длины)

ПРОБЛЕМА:

Если $file имеет маленький размер (я так понимаю меншье 4096 (- что это за цифра такая???)
то пока в $file2 не набьется 4096 цикл не останавливается...
т.е. моим способом нельзя получить копию первого файла, если его размер менее 4096.

подумал - что буферизация 
написал $| =1; - не помогло!!!

в принципе файлик размером 4096 редко встретишь - но вот я как раз пол дня промучался ...


В ЧЕМ ПРИЧИНА ТАКОГО ПОВЕДЕНИЯ???

СПАСИБО


Код

use strict; 
use warnings;

my $file = '1.txt'; 
my @file = ();
open (FILE, $file) or die;
while (<FILE>) {
    push (@file, $_); 
}
close (FILE); 


my $file2 = '2.txt'; 
open (FILE, '>'.$file2) or die;
while (-s $file > -s $file2) {
    foreach (@file) {
        print FILE $_."\n";
    }
}
close (FILE); 






--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ginnie
Дата 12.11.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



burakov, $| =1; влияет на выбранный select'ом файловый дескриптор. Предлагаю попробовать

Код

use IO::Handle;

autoflush FILE 1; # после второго open FILE



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


Опытный
**


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

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



Спасибо помогло...



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ad280379
Дата 6.12.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ginnie @ 12.11.2009,  15:33)
burakov, $| =1; влияет на выбранный select'ом файловый дескриптор. Предлагаю попробовать

Код

use IO::Handle;

autoflush FILE 1; # после второго open FILE

где-то читал что конструкция работает быстрее

select((select(FH),$|=1)[0]);
print FH "";

т.е. select & print работает быстрее чем IO::Handle & autoflush & print  

правда ?


P.S будет ли работать быстрее select & syswrite ?.
PM MAIL   Вверх
ginnie
Дата 7.12.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ad280379, мне лень тестировать, поэтому ограничусь аналитикой:

открываем IO::Handle и смотрим на метод autoflash

Код

sub autoflush {
    my $old = new SelectSaver qualify($_[0], caller);
    my $prev = $|;
    $| = @_ > 1 ? $_[1] : 1;
    $prev;
}


мне показалось странным присутствие переменной $old, но описание модуля SelectSaver все прояснило - при создании нового объекта SelectSaver дескриптор, переданный в new становится дефолтным. После уничтожения этого объекта восстанавливается предыдущий дефолтный.

из SelectSaver.pm:

Код

sub new {
    @_ >= 1 && @_ <= 2 or croak 'usage: SelectSaver->new( [FILEHANDLE] )';
    my $fh = select;
    my $self = bless \$fh, $_[0];
    select qualify($_[1], caller) if @_ > 1;
    $self;
}

sub DESTROY {
    my $self = $_[0];
    select $$self;
}


из Symbol.pm:

Код

sub qualify ($;$) {
    my ($name) = @_;
    if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) {
    my $pkg;
    # Global names: special character, "^xyz", or other. 
    if ($name =~ /^(([^a-z])|(\^[a-z_]+))\z/i || $global{$name}) {
        # RGS 2001-11-05 : translate leading ^X to control-char
        $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei;
        $pkg = "main";
    }
    else {
        $pkg = (@_ > 1) ? $_[1] : caller;
    }
    $name = $pkg . "::" . $name;
    }
    $name;
}


Судя по количеству кода, приведенный Вами метод быстрее, но это ускорение ничтожно, по сравнению с временем выполнения остального кода.

Добавлено через 2 минуты и 56 секунд
syswrite не использует буферизацию вообще, но требует учета массы нюансов (подробнее см. perldoc -f syswrite).


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


Новичок



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

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




ad280379, мне лень тестировать, поэтому ограничусь аналитикой:
это было бы сверх наглостью с моей стороны  smile 

т.е. получается при обьемах стремящихся к бесконечности имеем по быстродействию следующее

1) select & syswrite
2) select & $|=1 & print
3) IO:Handle & autoflash & print

правильно ? 

P.S. syswrite не использует буферизацию вообще - это мне известно.

Это сообщение отредактировал(а) ad280379 - 7.12.2009, 15:59
PM MAIL   Вверх
ginnie
Дата 7.12.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ad280379 @  7.12.2009,  15:58 Найти цитируемый пост)
т.е. получается при обьемах стремящихся к бесконечности

объемах чего? файловых дескрипторов? smile

объясните, для чего select в select & syswrite, в описании нет упоминания о возможности вывода в дефолтный дескриптор.

Это сообщение отредактировал(а) ginnie - 7.12.2009, 16:25


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


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

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


 




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


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

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