4

多次元配列に保存された大量のデータセットがあります。構造の例は次のとおりです。

Array
(
    [1] => Array
        (
            [0] => motomummy.com
            [1] => 1921
            [2] => 473
        )
    [4] => Array
        (
            [0] => kneedraggers.com
            [1] => 3051
            [2] => 5067
        )
)

また、mysqlデータベースにcurrently最大80Kのドメイン名を含むテーブルがあります。このリストは、おそらく最大10,000以上のドメイン名で毎月増加します。目標は、Array [] [0](ドメイン名)をmysqlデータベースと比較し、一意の値のみを含む保存された値(ただし、キーの保存は重要ではありません)を持つ配列を返すことです。

配列全体ではなく、最初のインデックスのみを比較したいことに注意してください。

初期の多次元配列は、サイズが非常に大きいと想定されています(おそらく、10万から1000万の結果のどこかにあります)。データベースに含まれていないデータを取り戻すための最良の方法は何ですか?

私が今していることは、データベースからのドメインの完全なリストを配列に格納し、次の関数を使用して、初期配列の各値をデータベース配列と比較することです。これはひどく遅く、明らかに非効率的です。

// get result of custom comparison function
$clean = array_filter($INITIAL_LIST, function($elem) {
$wordOkay = true;

// check every word in "filter from database" list, store it only if not in list           
    foreach ($this->domains as $domain) {
        if (stripos($elem[0], $domain) !== false) {
            $wordOkay = false;
            break;
        }
    }

    return $wordOkay;
});

この時点で、いくつかの擬似コードまたは実際のコードでさえ非常に役立ちます。

4

1 に答える 1

2

DBMSを使用してください!それはそのようなもののために作られました。

  • 一時テーブルを作成しますtemp{id(配列インデックスで埋める); url(urlで埋められます)}

  • アレイのデータを入力します

  • 理想的にはインデックスを作成しますtemp.url

  • データベースにクエリを実行します。

    SELECT * FROM `temp` LEFT JOIN `urls`
    WHERE urls.url = temp.url AND urls.url IS NULL;
    

    (表urlsは既存のデータです)

于 2012-12-21T16:53:56.550 に答える