Решаю сейчас следующую задачу. У меня есть граф, в котором около 10 миллионов вершин и в 100 раз больше ребер. На моем компьютере стоит 512Mb оперативки. Требуется запустить на графе поиск в ширину, глубину или сделать что-то подобное. В более сложном варианте хочется научиться считать какую-нибудь несложную функцию от ребер этого графа (вроде pagerank'а), т.е. уметь многократно и быстро получать список ребер для вершины. Как это можно сделать? Идея пока следующая. Граф хранится на харде и в память подгружаются только те ребра, обработка которых происходит в данный момент. Реализуется это чем-то вроде LRU-map'а. Собственно, вопросов несколько.
Не умеет ли сама ОС осуществлять 'подгрузку' в оперативную память нужных данных (при помощи, например, своих виртуальных страниц)? Не будет ли такой способ сильно хуже по производительности, чем 'ручной', описанный выше?
Может есть стандартные библиотеки/техники для решения задач подобного сорта?
Что-то я плохо понял, что имеется ввиду. 'Однопроходные операции' - это такие, где доступ к ребрам каждой вершины осуществляется один раз за весь алгоритм?
Да, про BFS полностью согласен. Его можно выполнять с минимальными затратами разными утилитами. За awk спасибо, удобная вещь. Просто у меня изначально немного другая задача стояла (и я зря, наверное, вынес в пост именно BFS) - научиться выполнять на больших графах любые алгоритмы. Вот захочется мне, например, запускать A*. В этом случае, боюсь, "без кода" не обойтись.
По первому вопросу - умеет. См. memory mapped files, mmap(). Но для того, чтобы замапить всю эту кучу данных целиком, наверняка не хватит 32-битных адресов. Производительность зависит от реализации в конкретной ОС; и вообще не стоит мапить большой файл в память, если он в основном просто последовательно читается. А вообще, нельзя ли разбить этот граф на компоненты, которые будет связывать относительно небольшое число ребер?
> А вообще, нельзя ли разбить этот граф на компоненты, которые будет связывать относительно небольшое число ребер? Увы, но сие невозможно... Впрочем, что-то подобное осуществимо, если ... но это сложнее, чем другие решения... да.
Вообще-то я еще не решил, как и где хранить граф. Совсем не уверен, что будет один большой файл с данными. Не исключаю возможность положить граф просто в БД.