Примечание: виновный автор векторных стратегий здесь (это очень маленькое название, поскольку это была просто взломанная функция, и я подумал, что другие найдут ее полезной).
Ваше наблюдение о том, что parVector
неправильно в том, что он позволяет GCed искры перед использованием кажется правильным.Совет SimonM означает, что я должен делать именно то, чего я пытался избежать, создать новый вектор, какой-то ценой, вместо старого.Зная, что это необходимо, есть небольшая причина, чтобы не менять parVector
на гораздо более простое определение:
parVector2 :: NFData a => Int -> Strategy (V.Vector a)
parVector2 n = liftM V.fromList . parListChunk n rdeepseq . V.toList
Обратите внимание, что исправление, данное Джоном Л., работает только потому, что оно «бьет» сборщика, заставляявычисления произойдут до сбора.
Я буду менять библиотеку векторных стратегий, так что в этом нет необходимости - чтобы ваш исходный код работал нормально.К сожалению, это повлечет за собой вышеупомянутую стоимость создания нового вектора (обычно минимального).