perl6 Как дать больше памяти MoarVM?

Я должен выполнить анализ данных на около 2 миллионов строк данных, а каждая строка длиной около 250 байтов. Итого около 500 мегабайт данных. Я использую последнюю версию Rakudo на Virtualbox Linux с памятью 4G.

Примерно через 8 часов у меня возникла паника из-за недостатка памяти в MoarVM. Как мне дать больше памяти MoarVM? К сожалению, я не могу разбить 2 миллиона на куски и сначала записать в файлы, потому что часть анализа данных требует целых 2-х строк.

Большое спасибо!!!

lisprog

2 ответа

Решение

Я предлагаю вам решить вашу проблему в несколько шагов:

  • Подготовьте два небольших образца файлов, если вы еще этого не сделали. Держите их очень маленькими. Я предлагаю файл длиной 2000 строк и файл длиной 20 000 строк. Если у вас уже есть образцы файлов примерно такой длины, они подойдут. Запустите вашу программу для каждого файла, отметив, сколько времени занимает каждый файл и сколько памяти было использовано.

  • Обновите свой вопрос своими заметками о продолжительности и использовании оперативной памяти; плюс ссылки на ваш исходный код, если это возможно, и примеры файлов, если это возможно.

  • Снова запустите два примера файлов, но с помощью профилировщика, как описано здесь. Посмотрите, что там, чтобы увидеть и обновить свой вопрос.

Если вы не знаете, как сделать что-либо из этого, спросите в комментариях.

Если все вышеперечисленное довольно просто, повторите для файла 100 000 строк.

Тогда у нас должно быть достаточно данных, чтобы дать вам лучшее руководство.

У MoarVM нет собственного верхнего предела памяти (в отличие, например, от JVM). Скорее, он выдает ошибку "недостаточно памяти" или "ошибка выделения памяти" только тогда, когда память запрашивается из операционной системы и этот запрос отклоняется. Это может быть связано с настроенными ограничениями памяти или с тем, что на самом деле не так много доступного ОЗУ / пространства подкачки для удовлетворения сделанного запроса (вероятно, если вы не настроили ограничения).

Трудно дать конкретный совет о том, что делать дальше, поскольку в этом вопросе мало деталей о программе, но некоторые вещи могут помочь:

  • Если вы обрабатываете данные в файле в какую-то другую структуру данных, и это возможно, прочитайте файл лениво (например, for $fh.lines { ... } нужно будет только сохранить Str для строки, которая в данный момент обрабатывается в памяти, а my @lines = $fh.lines; for @lines { } будет держать все Str объекты вокруг).
  • Это данные в файле ASCII или Latin-1? Если так, передайте :enc<ascii> или подобное при открытии файла. Это может привести к меньшему представлению памяти.
  • Если вы храните большие массивы целых чисел, чисел или строк, рассмотрите возможность использования массивов с нативной типизацией. Например, если у вас есть my int8 @a и хранить миллион элементов, тогда это занимает 1 МБ памяти; сделать это с my @a и все они будут в штучной упаковке объектов внутри Scalar контейнер, который на 64-битной машине, которая может съесть более 70 МБ. Подобное применимо, если у вас есть объект, для которого вы создаете много экземпляров, и вы можете сделать некоторые атрибуты нативными.
Другие вопросы по тегам