В качестве бессмысленного теста у нас есть система с внутренним кешем. В настоящее время мы загружаем 500К строк. Для каждой строки мы генерируем статистику, размещаем ключи в разных кэшах и т. Д. В настоящее время для обработки требуется менее 20 секунд.
Это бессмысленный тест, но это пример того, что в зависимости от обстоятельств 3M строк не так много строк на современном оборудовании.
Это сказал.
Как предлагали другие, разбейте работу на части и распараллелите прогоны, по 1-2 потока на ядро. Каждый поток поддерживает свои собственные локальные структуры данных и состояние, и в конце мастер-процесс объединяет результаты. Это грубый алгоритм «карта / уменьшение». Ключевым моментом здесь является обеспечение того, чтобы потоки не боролись за глобальные ресурсы, такие как глобальные счетчики и т. Д. Пусть окончательная обработка результатов потока обрабатывает их последовательно.
Вы можете использовать более одного потока на ядро, если каждый поток выполняет ввод-вывод в БД, поскольку ни один поток не будет чисто привязан к ЦП. Просто запустите процесс несколько раз с различным количеством потоков, пока он не выйдет быстрее всего.
Мы наблюдаем увеличение скорости на 50%, даже когда мы запускаем пакеты через постоянную систему очередей, такую как JMS, для распределения работы по сравнению с линейной обработкой, и я видел эти преимущества на 2-ядерных портативных компьютерах, поэтому есть определенное место прогресс здесь.
Еще одна вещь, если это возможно, не делайте ЛЮБОГО дискового ввода-вывода (сохраняйте чтение данных из БД) до самого конца. В этот момент у вас появляется гораздо больше возможностей для пакетирования любых обновлений, которые необходимо сделать, чтобы вы могли, по крайней мере, сократить время прохождения сигнала в сети. Даже если вам пришлось обновлять каждую строку, большие пакеты SQL все равно будут показывать чистый прирост производительности. Очевидно, что это может быть интенсивное использование памяти. К счастью, большинство современных систем имеют много памяти.