![](https://habrastorage.org/files/07b/abc/b6e/07babcb6ec244be08d9cf5e7df81c409.png)
まず、このようなグラフは美しく見えます:
![](https://habrastorage.org/files/e3c/f97/074/e3cf970746a44c39bd29dfcefa825cb3.png)
次に、その助けを借りて、特定のトピックのグループをすばやく選択できます。 たとえば、編み物に関するグループを見つける必要があります。 キーワード "knitting"により、たとえばKnitting -Knitting online-という適切なグループが見つかります。 関連付けられているグループを表示します。
編み物-オンラインで編み物-:
6.04% ヤーン株式会社
5.90% Mommy’s Channel- クリエイティブな母親向け(HOOK!)
3.40% ニット。 この世界では、すべてが接続されています...))
3.01% 糸安い、フリース、編みブレスレット用のゴム
2.35% 糸スパゲッティスパゲッティ
1.87% 糸屋Eestilõng(カウニ、カウニ)
1.73% *かぎ針編みのアート*
1.70% カウニ糸はエストニアの伝説です。 編み物。
1.66% 「レースモチーフ」-編み物と裁縫
1.54% トルコ糸の在庫品および注文品(ウクライナ)
そして、疲れるまで、または新しい名前が表示されなくなるまで繰り返します。
編み物。 この世界では、すべてが接続されています...:
8.88% ヤーン株式会社
3.06% Mommy’s Channel-クリエイティブなママ向け(HOOK!)
2.58% 糸安い、フリース、編みブレスレット用ゴム
2.30% 編み物-オンライン編み物-
2.14% 糸オンラインストア「透かし彫り」
1.94% カウニ糸はエストニアの伝説です。 編み物。
1.85% 糸ストア-ღあなたの糸ღ
1.76% 糸
1.72% 透かし彫りの世界:愛とつながる!
1.55% 糸屋Eestilõng(カウニ、カウニ)
ヤーン株式会社:
7.54% ニット。 この世界では、すべてが接続されています...))
4.01% Mommy’s Channel-クリエイティブなママ向け(HOOK!)
3.47% 編み物-オンライン編み物-
3.20% 糸安い、フリース、編みブレスレット用ゴム
2.72% 糸オンラインストア「透かし彫り」
2.67% 糸
2.11% 「マダム・ビャザルキナ」糸(裁縫用グッズ)
2.00% カウニ糸はエストニアの伝説です。 編み物。
1.85% 糸屋Eestilõng(カウニ、カウニ)
1.82% 糸スパゲッティスパゲッティ
「Madame Vyazalkina」糸(裁縫用グッズ):
2.49% 糸
2.37% ヤーン株式会社
1.42% 糸屋Eestilõng(カウニ、カウニ)
1.39% カウニ糸はエストニアの伝説です。 編み物。
1.32% 糸安い、フリース、編みブレスレット用のゴム
1.26% 糸と裁縫店
1.24% ニット帽など。
1.21% ホビー&ホーム| 針仕事
1.18% Yarn Online Store "Openwork"
1.15% 糸スパゲッティスパゲッティ
同様の結果は、検索用のキーワード「編み物」、「糸」、「針仕事」、「かぎ針編み」を正しく選択することで実現できます。 しかし、それらは常に簡単に思いつくとは限りません。
このようなグラフを作成するために、いくつかの非自明な技術的ソリューションが使用されました。
特定のサイズのグループの完全なリストを取得するために、素晴らしいサイトallsocial.ruがアップロードされました 。 彼らはこのデータをどのように収集するのだろうか? 彼らはすべてのインデックスを通過します: vk.com/club1、vk.com/club2 、...? 5,000人から10,000人の加入者数を持つ中規模グループのみが、2つの理由で引き受けられました:MDKのような大衆がポンプをかけようとしているが、さらに重要なことには、それらのメンバーシップは特別な信号を運ばず、そのようなグループは世界中のすべてに接続されています。
VKontakteのIPAでグループサブスクライバーのリストを取得する特別な方法があります。 ただし、一度に1000人のユーザーを1秒間に3回しか受信できません。 そして、約10億人のユーザー、つまりdofigaを利用する必要がありました。 VKが各リクエストに即座に応答する場合、3〜4日間待つ必要があることがわかります。 これは一般に許容範囲ですが、ドキュメント内の次のコメントを混同します。
呼び出しの頻度の制限に加えて、同じメソッドの呼び出しには定量的な制限があります。 明らかな理由により、正確な制限に関する情報は提供していません。
私たちの場合、1,000,000件のリクエストを行う必要があるため、この発言は迷惑です。 ここで最もクールなexecuteメソッドが役立ちます。 VKから来た人たちに対する彼の尊敬の念。 他の誰かがそのようなものを持っていますか? 要するに、executeを使用すると、特殊言語VKScriptのプログラムをContactに送信し、そこにいくつかのAPIリクエストを詰め込み、場合によっては何らかのロジックを詰め込めます。 私の場合、プログラムは次のようになりました。
return [ API.groups.getMembers(id=1, offset=0, count=1000), API.groups.getMembers(id=1, offset=1000, count=1000), API.groups.getMembers(id=1, offset=2000, count=1000), API.groups.getMembers(id=1, offset=3000, count=1000), API.groups.getMembers(id=1, offset=4000, count=1000), API.groups.getMembers(id=1, offset=5000, count=1000), ... ];
プログラム内では、25を超えるAPI呼び出しを行うことはできません。 つまり、リクエストの数は40,000に削減され、理論的には禁止は通過できます。 そのようなリクエストはすぐには実行されなくなりましたが、約5〜6秒でしたので、私はまだ待たなければなりませんでした。 はい、いくつかのストリームでダウンロードを開始することは可能ですが、それでも愚かでした。 2日半後、すべてがアップロードされ、ディスクに約10GBかかりました。
ここで、これらの10GBをRAMに詰め込む方法と、100,000グループのオーディエンスのペアワイズ交差を計算する方法の問題が発生します。 通常、各ユーザーが少数のグループで構成されているという事実が保存されます(ユーザーの99%は15未満のグループに属しています)。 各ユーザーが交差点で行った貢献を書き留めてから、これらの貢献を追加できます。 たとえば、AとB、および3つのグループ1、2と3の2人のユーザーがいるとします。Aは3つすべてで構成され、Bは1と3のみです。Aは3つの交差点に貢献します:(1、2)、(1 、3)および(2、3)、B-1つに:(1、3)。 さらに、1と3が2人のユーザーで交差し、残りのグループは1人ずつ交差することを取得します。 技術的に15グループ以上のユーザーを無視する場合、約500,000,000の交差点を書き出す必要があります。これは、額で解くよりもはるかに優れており、100,000 * 100,000の交差点を計算する必要があります。
すばらしい、RAMに問題があるだけでした。 幸いなことに、説明したアルゴリズムはマップリデューサーのパラダイムによく適合しているため、50行のナノフックが切断され、計算は次のようになりました。2つの列で構成されるグループとユーザーを記述します。
group user 3953835 10 2065169 100001643 2112714 100001643 ...
ファイルは約9GBであることがわかりました。2列目のUnixソートでソートしました。PavelDurovの位置を確認してください。
group user 2226515 1 37110020 1 38354466 1 43453499 1 60140141 1 60615047 1 64980878 1 1019652 10 ...
ファイルを読み取り、2番目の列でストリームをグループ化し、ユーザーグループのリストのみを保持するメモリに保存します。グループが15未満の場合は、一致するすべてを別のファイルに書き出します。
source target 10000 10027193 9980615 9997141 9974 9976553 ...
しきい値が正しく選択されているため、ファイルは大きすぎません-〜9GB。 2つの列に並べ替えます。
source target 10000 100000 10000 100000 10000 10009982 10000 100100 10000 100100 10000 10019194 10000 10019194 10000 1002 10000 1002 10000 1002 ...
次に、ファイルが読み取られ、2つの列にグループ化され、交差点がすぐに考慮されます。 たとえば、グループ10,000および100,000の場合、2人のユーザーをリストします。 これはすぐに言うことができ、何もメモリに保存する必要はありません。
さらに、いくつかの合理的なしきい値に従ってrib骨がフィルタリングされるため、それらの多くは残っていません。 結果はGefiで表示できます。 2つの秘密があります:すべてが痛みなく長く動作しないためには、エッジの描画をオフにする必要があります、スタイリングのためにOpenOrdをダウンロードする必要があります、彼は〜5分で〜100,000頂点に私のグラフを積み上げました。
理論的には、たとえばサイトとユーザー、クエリと発行結果という2つの関連エンティティがあるタスクで同様のアプローチを使用できます。