Так что, если я правильно понял, ваш поток будет выглядеть примерно так:
- Считать 2 миллиона строк из CSV в карту -> struct
- Запустить часть A (для которой не нужны данные из CSV)
- Выполнить часть B, используя данные из CSV
Зачем читать данные до того, как они вам понадобятся, это был бы первый вопрос, но, возможно, это не имеет значения.
Вероятно, сборщик мусора обычно получает доступ к 2 миллионам структур на карте. В зависимости от того, какое значение имеет GOGC
, компонент кардиостимулятора сборщика мусора может включаться чаще, когда увеличивается объем выделяемой памяти. Поскольку эта карта отложена для последующего использования, GC ничего не должен делать, но он требует циклов проверки данных независимо. Есть несколько вещей, которые вы можете сделать, чтобы проверить и объяснить это поведение - все эти вещи могут помочь вам исключить / подтвердить, замедляет ли сбор мусора вас.
- Профилируйте код (очевидно, важный для диагностики) IIRC, профиль ЦП с большей готовностью показывает вмешательства GC
- Попробуйте отключить сборку мусора (
debug.SetGCPercent(-1)
)
- Сохраните карту в
sync.Pool
. Этот тип предназначен для хранения вещей, которыми вы будете управлять вручную, и выхода за пределы обычных циклов GC.
- Читайте CSV только тогда, когда вам нужно, не читайте его раньше «часть A»
- Потоковый файл, вместо того, чтобы читать его на массивной карте. 2 миллиона строк, какова ценность чтения всего этого в памяти, а не чтения построчно?