Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 24, 2007 04:13:25

rsm
От:
Зарегистрирован: 2007-08-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Быстрая запись в файл

Нужно написать код, который будет максимально быстро создавать пустой (забитый нулями) файл размером несколько гигабайт. На Perl это выглядит так:

#!/usr/bin/perl -w
use Fcntl;
my @array;
$array[$_] = chr(0x00) for (0..1023);
$out_str = pack("x1024", @array);
sysopen(OUTFILE, "file.tmp", O_WRONLY | O_CREAT | O_TRUNC) || die "DEBUG: $!";
for ($i = 0; $i < 1048576; $i++) { # запишем 1 Гб
	syswrite(OUTFILE, $out_str);
}
close(OUTFILE);
Т.е. используется прямой небуферизованный вывод (syswrite), за счет чего скорость записи возрастает в несколько десятков (!) раз. Аналогичный код на Python должен работать так же быстро и иметь 100% переносимость (win-модули отпадают сразу).
Заранее спасибо за советы!



Офлайн

#2 Сен. 24, 2007 08:47:10

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Быстрая запись в файл

Если 1-в-1, то

import os

chunk = ‘\x00’*1024
fd = os.open('file.tmp', os.O_WRONLY|os.O_CREAT|os.O_TRUNC)

for i in xrange(1048576):
os.write(fd, chunk)

os.close(fd)


А если pythonic, то

chunk = ‘\x00’*1024
fh = open('file.tmp', ‘wb’)

for i in xrange(1048576):
fh.write(chunk)

fh.close()


Скорость одинакова ;)

$ time ./zero.pl

real 0m10.996s
user 0m0.800s
sys 0m2.870s

$ time ./zero_perlish.py

real 0m13.503s
user 0m1.570s
sys 0m3.230s

$ time ./zero_pythonic.py

real 0m11.205s
user 0m2.110s
sys 0m2.320s
+-2 секунды – погрешность



Отредактировано (Сен. 24, 2007 08:53:35)

Офлайн

#3 Сен. 25, 2007 16:22:59

rsm
От:
Зарегистрирован: 2007-08-15
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Быстрая запись в файл

j2a: отлично работает, спасибо!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version