MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Networkx никога не приключва с изчисляването на централната централна среда за 2 mil възли

TL/DR:Централността на междуличността е много бавно изчисление, така че вероятно искате да използвате приблизителна мярка, като вземете предвид подмножество от myk възли, където myk е някакво число, много по-малко от броя на възлите в мрежата, но достатъчно голямо, за да бъде статистически значимо (NetworkX има опция за това:betweenness_centrality(G, k=myk) .

Изобщо не съм изненадан, че отнема много време. Междуцентралността е бавно изчисление. Алгоритъмът, използван от networkx, е O(VE) където V е броят на върховете и E броя на ръбовете. Във вашия случай VE = 10^13 . Очаквам импортирането на графиката да отнеме O(V+E) време, така че ако това отнема достатъчно време, за да можете да разберете, че не е моментално, тогава O(VE) ще бъде болезнено.

Ако намалена мрежа с 1% от възлите и 1% от ръбовете (така че 20 000 възела и 50 000 ръба) ще отнеме време X, тогава желаното от вас изчисление ще отнеме 10 000X. Ако X е една секунда, тогава новото изчисление е близо до 3 часа, което според мен е невероятно оптимистично (вижте моя тест по-долу). Така че, преди да решите, че нещо не е наред с вашия код, изпълнете го в някои по-малки мрежи и получете оценка какво трябва да бъде времето за изпълнение за вашата мрежа.

Добра алтернатива е да използвате приблизителна мярка. Стандартната мярка за междуличност разглежда всяка отделна двойка възли и пътищата между тях. Networkx предлага алтернатива, която използва произволна извадка от само k възли и след това намира най-кратките пътища между тези k възли и всички други възли в мрежата. Мисля, че това трябва да ускори работата в O(kE) време

Така че това, което бихте използвали, е

betweenness_centrality(G, k=k)

Ако искате да имате граници за това колко точен е вашият резултат, можете да направите няколко извиквания с малка стойност от k , уверете се, че са относително близки и след това вземете средния резултат.

Ето някои от моите бързи тестове на времето за изпълнение, със произволни графики на (V,E)=(20,50); (200 500); и (2000,5000)

import time
for n in [20,200,2000]:
    G=nx.fast_gnp_random_graph(n, 5./n)
    current_time = time.time()
    a=nx.betweenness_centrality(G)
    print time.time()-current_time

>0.00247192382812
>0.133368968964
>15.5196769238

Така че на моя компютър са необходими 15 секунди, за да се справя с мрежа, която е 0,1% от размера на вашия. Ще са необходими около 15 милиона секунди, за да направите мрежа със същия размер като вашата. Това е 1,5*10^7 секунди, което е малко под половината от pi*10^7 секунди. Тъй като pi*10^7 секунди е невероятно добро приближение към броя секунди за една година, това ще отнеме на компютъра ми около 6 месеца.

Така че ще искате да стартирате с приблизителен алгоритъм.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. проекцията не работи със заявка за намиране

  2. актуализация на MongoDB()

  3. Компресиране на индексен префикс в MongoDB 3.0 WiredTiger

  4. MongoError:Не може да се извлече гео ключове от обект с Тип:Точка

  5. Как да поставите файл с изображение в json обект?