Найти - Пользователи
Полная версия: Быстрая запись в файл
Начало » Python для экспертов » Быстрая запись в файл
1
rsm
Нужно написать код, который будет максимально быстро создавать пустой (забитый нулями) файл размером несколько гигабайт. На 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-модули отпадают сразу).
Заранее спасибо за советы!
j2a
Если 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 секунды – погрешность
rsm
j2a: отлично работает, спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB