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 МБ. Подобное применимо, если у вас есть объект, для которого вы создаете много экземпляров, и вы можете сделать некоторые атрибуты нативными.