[perl] извлечение подмассива из массива
да, ессно, использую use strict и внутри блока процедуры перед переменными стоит my.
как бы оптимизировать извлечение подмассивов, перегружая комп по минимуму?А сам как думаешь?
формат файла какой?
@seq = <fi>;Вот в этом проблема. Зачем тебе выгружать все содержимое файла в "операционку"? Читай построчно и выбирай нужные строки.
а вообще то, если бы знал то не постил бы здесь вопрос
это то (не работает пробел ) понятно, собственно и хотел бы от этого избавится, но пока не понял как. а если построчно, то как делать splice?
0.974
0.784
и т.д.
расширение txt, но это не важно
просто если это так, то при построчном чтении файла для того же результата, что дает splice, придется немного подзаморочиться.
если нет, то проблем никаких быть не должно. вводишь счетчик строк и вперед.
поэтому на самом деле в массиве строки файла, которые по счастливой случайности являются числами
если числа одного формата (под каждое одно и то же число символов то рассчитывай параметр $offset в
seek ($fh, $offset, 0)
и читай посимвольно
думаю, идея понятна
все положительное. ну видимо да, так и придется, построчно. хотелось изначально все таки со splice все сделать
хотелось изначально все таки со splice все сделатьхехе
как ты себе это представляешь?
если токо подсунуть ему хитрый аррэй, который заполняется по мере обращения к нему
даже если бы такое и было возможно (на скоко я знаю в перле симпл типы нельзя унаследовать) то кода у тебя было бы явно больше чем 2 строчки
на считывание строки и инкрементирование счетчика
$offset в случае seek это просто номер строки?
я имел ввиду тот вариант, который в первом посте, без построчного обращения к файлу
`sed -n '$start,$end\p;$end\q' $filename`
да, sed это вариант, сейчас просвещаюсь по нему
может можно видоизменить алгоритм чтобы в эту функцию передавать сразу все интервалы и за один проход все считывать?
можно будет попробовать, но изменение будет слишком долгим (другие дела торопят); пока мне больше нравится вариант с sed
если не пересекаются, то экономии в памяти не будет, а реализовывать потом разбор общей выборки --- только лишняя возня, которая в этом случае ничем не оправдывается
действительно, все действительно очень "круто" и быстро ) спасибо )
да, варианты не исключают друг друга, мне просто не хочется возится с сильным изменением кода, чтобы стало только одно обращение к файлу за всеми требуемыми подмассивами. да, и в проге уже реализован разбор этой кучи подмассивов.
Сейчас попробовал, седовский вариант намного быстрее построчного.
Сейчас попробовал, седовский вариант намного быстрее построчного.построчного или то которое было в изначальном варианте с загонением в память?
интересно почему сед быстрее
потому что он на Си написан что ли?
sed хавает файло кусками, как правило, большими, чем одна строчка
разработчики sed'а, думаю, уже хорошо подумали над всеми возможными оптимизациями тех задач, которые он решает =)
Например, если файл - это числа вида x.xxx, после которых идет "\n" (то бишь 6 символов в итоге; если же "\r\n", то будет 7 то можно организовать такую вещь:
sub extract {
($name, $offset, $len)= @_;
open my $fh, '<', $name;
seek($fh, $offset*6, 0); # возможно, придется умножать на 7 - см. примечание выше
my (@mas, $str);
foreach (1..$len) {
read($fh, $str, 6); # возможно, придется ставить 7 - см. примечание выше
chomp($str);
push(@mas, $str);
}
close($fh);
return @mas;
}
На скорость не проверял, вполне возможно, что сед все равно рулит
Оставить комментарий
Fake_queen
из десятка файла, содержащих простой список с числами, размером под 140 мегов каждый в определенном порядке должны извлекаться подмассивы чисел. таких обращений к каждому файлу будет порядка 1000. алгоритм процедуры очень простой, что то вроде этого (под рукой нет скрипта)проблема в том, что такая операция ОЧЕНЬ сильно загружает операционку, на маломощном компе вообще вылетает сообщение об ошибке. как бы оптимизировать извлечение подмассивов, перегружая комп по минимуму?