Ну, вы не дали много, чтобы продолжить. Вы не описываете свои данные, и вы не описываете, что делают ваши данные или когда вам нужен один объект в отличие от другого, и как эти объекты временно освобождаются, и при каких обстоятельствах вы нуждаетесь в них обратно, и ... .
Так что все, что кто-нибудь здесь скажет, будет полным выстрелом в темноте.
... так вот, вот выстрел в темноте.
Если вам удобно одновременно хранить x элементов в памяти, выделите место для x элементов. Затем, каждый раз, когда вы получаете доступ к объекту, запишите время (это может означать не столько часы, сколько порядок их доступа). Сохраняйте каждый элемент в списке (он может быть реализован не в виде списка, а скорее как куча-подобная структура), чтобы последние использованные элементы появлялись в списке раньше. Когда вам нужно поместить новый в память, вы заменяете тот, который использовался давным-давно, а затем перемещаете этот элемент в начало списка. Вам может понадобиться сохранить другой индекс предметов, чтобы вы знали, где именно они находятся в списке, когда они вам нужны. Затем вы посмотрите, где находится элемент, свяжите его родительский и дочерний указатели, а затем переместите его в начало списка. Возможно, есть и другие способы оптимизации времени поиска.
Это называется LRU algroithm. Это схема замены страницы для виртуальной памяти. Что он делает, так это задерживает ваше узкое место (дисковый ввод / вывод) до тех пор, пока его, вероятно, невозможно избежать. Стоит отметить, что этот алгоритм не гарантирует оптимальной замены, но, тем не менее, работает довольно хорошо.
Кроме того, я бы рекомендовал распараллеливать ваш код в значительной степени (если это возможно), чтобы при загрузке или выгрузке одного элемента можно было загружать процессор, выполняя реальную работу.
Исходя из вашего комментария, вы работаете в нейронной сети. В случае вашего первоначального сложения данных (до этапа исправления) или когда вы активно используете его для классификации, я не вижу, как алгоритм является плохой идеей, если только нет никакого возможного способа соответствовать наиболее часто используемые узлы в памяти.
На этапе коррекции (возможно, обратно-подпорка?) Должно быть очевидно, какие узлы вы ДОЛЖНЫ хранить в памяти ... потому что вы уже посетили их!
Если ваша сеть большая, вам не уйдет без дискового ввода-вывода. Хитрость заключается в том, чтобы найти способ минимизировать это.