Таким образом, текущее использование памяти в худшем случае составляет 16 ГБ. Имея только 8 ГБ оперативной памяти, вам повезет, если у вас останется 6 или 7 ГБ памяти после того, как ОС и системные процессы получат свою долю. Таким образом, в среднем вы уже будете загружать память в умеренно загруженной системе. Сколько ядер у машины? У вас есть 8 рабочих потоков, потому что это 8-ядерный компьютер?
По сути, вы можете уменьшить потребление памяти или увеличить объем доступной памяти. Вариант 1, использующий только 4 потока, недостаточно использует ресурсы ЦП, что может вдвое снизить пропускную способность - определенно неоптимально.
Вариант 2 возможен, но рискован. Управление памятью очень сложное, и запросы на доступную память не гарантируют, что вы сможете продолжить и распределить этот объем (не вызывая подкачку). Взрыв дискового ввода-вывода может привести к тому, что система увеличит размер кэша, может запуститься фоновый процесс и заменить его рабочим набором, а также ряд других факторов. По этим причинам, чем меньше доступной памяти, тем меньше на нее можно положиться. Кроме того, со временем фрагментация памяти также может вызвать проблемы.
Вариант 3 интересен, но может легко привести к недогрузке процессора. Если у вас есть запуск заданий с высокими требованиями к памяти, вы можете в конечном итоге запустить только несколько потоков и оказаться в той же ситуации, что и вариант 1, где вы недогружаете ядра.
Таким образом, принимая стратегию «снижения потребления», вам действительно нужно, чтобы все данные были сразу помещены в память? В зависимости от алгоритма и схемы доступа к данным (например, случайный или последовательный) вы можете постепенно загружать данные. Более эзотерические подходы могут включать сжатие, в зависимости от ваших данных и алгоритма (но на самом деле это, вероятно, пустая трата усилий).
Тогда есть «увеличение доступной памяти». С точки зрения цены / производительности, вы должны серьезно подумать просто о покупке большего количества оперативной памяти. Иногда инвестиции в большее количество оборудования обходятся дешевле, чем время разработки, чтобы достичь того же конечного результата. Например, вы могли бы поместить 32 ГБ ОЗУ на несколько сотен долларов, и это сразу улучшило бы производительность, не добавляя сложности решению. При снижении производительности вы можете профилировать приложение, чтобы увидеть, где вы можете сделать программное обеспечение более эффективным.