Я работаю над проблемой, которая, как мне показалось, людям может показаться интересной (и, возможно, кто-то знает о ранее существовавшем решении).
У меня большой набор данных, состоящий из длинного списка пар указателей на объекты, что-то вроде этого:
[
(a8576, b3295),
(a7856, b2365),
(a3566, b5464),
...
]
Существует слишком много объектов, чтобы хранить их в памяти одновременно (возможно, сотни гигабайт), поэтому они должны храниться на диске, но могут кэшироваться в памяти (возможно, с использованием кэша LRU).
Мне нужно пройти через этот список, обрабатывая каждую пару, для чего требуется, чтобы оба объекта в паре были загружены в память (если они там еще не кэшированы).
Итак, вопрос: есть ли способ переупорядочить пары в списке, чтобы максимизировать эффективность кэша в памяти (другими словами: минимизировать количество пропусков кэша)?
Примечания
Очевидно, что алгоритм переупорядочения должен быть настолько быстрым, насколько это возможно, и не должен зависеть от возможности иметь весь список в памяти сразу (так как для этого у нас недостаточно ОЗУ) - но при необходимости он может перебирать список несколько раз.
Если бы мы имели дело с отдельными объектами, а не парами, то простым ответом было бы отсортировать их. Это, очевидно, не сработает в этой ситуации, потому что вам нужно учитывать оба элемента в паре.
Проблема может быть связана с нахождением минимального разреза графа , но даже если проблемы эквивалентны, я не думаю, что решения для минимального разреза соответствуют
Я предполагаю, что эвристик будет передавать данные с диска и записывать их порциями в лучшем порядке. Возможно, придется повторить это несколько раз.
На самом деле это могут быть не просто пары, это могут быть триплеты, четверки или больше. Я надеюсь, что алгоритм, который делает это для пар, может быть легко обобщен.