предотвращение чрезмерного использования памяти - PullRequest
3 голосов
/ 19 марта 2020

мой скрипт работает построчно. Задание на строку подразумевает использование грамматики, но не слишком сложно. Я замечаю, что когда на входе много строк, скажем, 150_000, использование памяти составляет гигантские c, более 6 ГБ, и мой компьютер зависает. Я использовал --profile для более короткого ввода, но это не дает мне понятия, где искать решение. Большинство имен там не относятся к моему коду. Любые предложения о том, где я могу предотвратить использование ложной памяти или выяснить, что вызывает это?

вот ядро ​​l oop:

method process() {
    my $promise = Promise.start({
      &!start-handler();
      my $intro = 1; # to skip the directory part of the file.
      for $!source-name.IO.lines {
        ...
      }
    }).then({ $!DB.completed });
    await $promise;
  }

Спасибо, Тео

1 Ответ

4 голосов
/ 19 марта 2020

Я нашел одну вещь, которая вызвала havo c. Изменяя строку

m:g/ << $<funname>=<[A..Z]>+ '(' <{ %fun{$<funname>}++ }> /;

на что-то вроде

 if $formula ~~ m:g/ << $<funname>=<[A..Z]>+  '(' / {
        for $/.list -> $funname {
          %fun{$<funname>}++
        };
      }

, скрипт увеличивается в миллион раз и работает без проблем.

Однако, см. Реакцию @ JonathanWorthington ниже , Мой вывод: я должен был использовать:

m:g/ << $<funname>=<[A..Z]>+ '(' { %fun{$<funname>}++ } /;

Опять же, это работало в предыдущих выпусках rakudo. Это версия Rakudo 2020.01, построенная на MoarVM версии 2020.01.1 с реализацией Perl 6.d.

...