LINUX.ORG.RU

История изменений

Исправление gh0stwizard, (текущая версия) :

Тут двойное потребление ОЗУ из-за незнания особенностей Perl. Можно переписать иначе и тогда потребление снизится до минимума:

while (<STDIN>) { print grep /$ARGV[0]/ }
Как-то так, код не проверял. Смысл в том, что @strings=<STDIN> загонит входной файл в ОЗУ, а это для данной задачи не нужно.

А вообще, проблема кроется в том, как Perl выделяет память под данные. В частности, для строк и элементов массива в строковом представлении обычно выделяется намного больше памяти, чем они действительно занимают. Кроме того, при операциях со строками, Perl их не модифицирует, если происходят операции «вырезания» куска из строки, а использует счетчики. В итоге, если загнать файл как указано в оригинальном примере скажем в 123 678 байт, то Perl выделит скорее больше памяти, чем ожидается (может 192 кб, может 256 кб, зависит от длин строк).

Исходная версия gh0stwizard, :

Тут двойное потребление ОЗУ из-за незнания особенностей Perl. Можно переписать иначе и тогда потребление снизится до минимума:

while (<STDIN>) { print grep /$ARGV[0]/ }
Как-то так, код не проверял. Смысл в том, что @strings=<STDIN> загонит входной файл в ОЗУ, а это для данной задачи не нужно.