вступление
У меня есть довольно сложная программа на Python (скажем, более 5000 строк), написанная с помощью Python 3.6. Эта программа анализирует огромный набор данных из более чем 5000 файлов, обрабатывает их, создавая внутреннее представление набора данных, а затем создает статистику. Поскольку мне нужно протестировать модель, мне нужно сохранить представление набора данных, и сейчас я делаю это, используя сериализацию через dill
(в представлении есть объекты, которые pickle
не поддерживает). Сериализация всего набора данных без сжатия занимает около 1 ГБ.
Эта проблема
Теперь я хотел бы ускорить вычисления за счет распараллеливания. Идеальным способом будет многопоточность, но GIL запрещает это. Модуль multiprocessing
(и multiprocess
, который также dill
совместим) использует сериализацию для обмена сложными объектами между процессами, так что, в лучшем случае, который мне удалось изобрести, распараллеливание не влияет на производительность по времени из-за огромного размера набора данных.
Вопрос
Как лучше всего справиться с этой ситуацией?
Я знаю о posh
, но похоже, что он совместим только с x86
, ray
но он также использует сериализацию, gilectomy
(версия python без gil), но я не могу заставить его распараллеливать потоки и Jython
, у которого нет GIL, но нет совместим с python 3.x.
Я открыт для любой альтернативы, любого языка, каким бы сложным он ни был, но я не могу переписать код с нуля.
Array
(или какую-либо другую форму объекта общей памяти изmultiprocess
)? - person Mike McKerns   schedule 13.02.2018List[Tuple(String, List[StreamReduction])]
, гдеStreamReduction
- объект Python, созданный мной и составленный из других созданных мной объектов, а последние, в свою очередь, состоят изmusic21
объектов, которые еще более сложны. Так что очень трудно перевести моиStreamReduction
на типы C, даже если это теоретически возможно. Да, мне нужно сравнить каждыйStreamReduction
со всем набором данных, который представляет собойO(n^2)
. - person fortea   schedule 13.02.2018nogil
вcython
или чего-то подобного? Это потребует серьезного переписывания, но, возможно, в этом случае вам придется это сделать. - person Mike McKerns   schedule 13.02.2018nogil
иcython
могут быть случайными, но мне понадобится оболочка для преобразования объектов Python в структуры C, потому что в блокахno gil
могут быть затронуты только данные C - person fortea   schedule 13.02.2018dill
есть несколько вещей, которые позволяют использовать более мелкие огурцы - например,dill.settings['byref'] = True
, который позволяетdill
мариновать классы и тому подобное по ссылке - однако другим потенциальным подходом было бы добавление методаreduce
илиreduce_ex
к вашему классу, который направляетdill
на выгрузите только то состояние, которое необходимо для сравнения. - person Mike McKerns   schedule 13.02.2018__reduce__
может помочь. Но главная проблема здесь - разделяемая память. Я думаю, прямого решения не существует. Я был энтузиастом Python, но это меня очень разочаровало - person fortea   schedule 13.02.2018