3

1,000,000 レコードの json ファイルに dataID を保存したとしましょう。

私の zresults.json = {"dataID":["1","2","3", ... "1000000"]}z

配列でID「100000」を見つけたい。

$file = file_get_contents('results.json');
$data = json_decode($file,true);
if(in_array('100000', $data['dataID']))
{
  echo "found";
} else {
  echo "not found"; 
}

約0.6秒かかりました。結果のために。

このようなjson配列で検索するためのより高速な方法はありますか?

例を教えてください!

前もって感謝します。

アップデート:

SQLははるかに高速ですが、1つのテーブルに1,000,000レコードを考慮すると、レコードが増えるほどスペースが増えます! 少なくとも、静的ファイルはサーバーの負荷を減らし、スペースを減らしました。

システムの設計方法によって異なります。適切な場所と適切なタイミングで使用してください。

4

5 に答える 5

2

もちろん!

$stm = $pdo->prepare("SELECT 1 FROM data WHERE id = ?");
$stm->execute(array(100000));
if ($stm->fetchColumn())
{ echo "found"; } else { echo "not found"; }

最初にアレイをデータベースにインポートする必要があります。

于 2013-08-09T11:21:31.607 に答える
1

ファイル内のデータの構造によっては、results.jsonたとえば単純な文字列検索を実行できる場合があります。

$file = file_get_contents('results.json');

if(strpos($file, '"100000"') !== false)
{
    echo 'found';
}
else
{
    echo 'not found';
}

メソッドのベンチマークを行った後、(遅いローカル システムでは) 約 0.78 秒になりましたが、このメソッドでは約 0.03 秒を達成しました。

私が言うように、それはデータ構造に依存しますが、この方法を使用できる場合は、速度が大幅に向上します。

于 2013-08-09T11:36:23.450 に答える
0

IDをキーとして保存してから、次のことを行いませんか。

if(isset($data['dataID']['100000'])){
 // do something
}

キーが存在するかどうかを確認することは、配列をループするよりもはるかに高速であるためです。詳細については、次のリンクをご覧ください。

Big-O for PHP 関数のリスト

于 2013-08-09T11:20:53.790 に答える
0

json 形式にバインドされている場合は、プレーンな json ファイルを操作する代わりに、mongo DBのようなドキュメント ベースのデータベースを試す必要があります。

mongoDB は、プレーンな PHP ソリューションがファイルを何度も解析しなければならなかったメモリに json オブジェクトを保持できることに注意してください。

3 つのパフォーマンス向上が見られます。

  • ディスク IO の削減
  • 解析が少ない
  • 索引ベースの検索
于 2013-08-09T11:21:20.123 に答える
0

結果を予測することは可能かもしれません。その後、in_array を使用して、はるかに小さい json で値を検索できます。

それ以外の場合は、別の検索アルゴリズムを試すことができますが、それらは複雑になる可能性があります。

于 2013-08-09T11:22:49.187 に答える