У вас явно достаточно памяти, чтобы вместить весь результат (400Мб, не так ли?), Так что, вероятно, вы могли бы вместить весь источник слишком 800Мб - это большое, но не слишком большое? Затем вы можете быстро выделить весь буфер ответов прямо в начале.
Если вы готовы использовать еще больше памяти, вы можете воспользоваться методом «удвоения».
Объедините 1 и 2, чтобы сформировать А1, 3 и 4, чтобы сформировать А2 и т. Д. До A2500 (теперь вы можете сбросить массивы первого уровня)
Затем объедините A1 и A2, чтобы сформировать B1; A3 и A4 для формирования B2 до B1250 (теперь вы сбрасываете массивы A)
И так далее получим C1-C625, D1-D313, E1-E157 ... M1, что является окончательным ответом
Таким образом, любое заданное число перемещается 15 раз, тогда как в настоящее время вы перемещаетесь каждое число 5000 раз.