非常に複雑なオブジェクトをシリアル化せずに保存するにはどうすればよいですか、またはシリアル化解除を高速化するにはどうすればよいですか?
そうでないstdClass
(データメンバーの隣にクラス定義がある)PHPオブジェクトが必要な場合は、あらゆる種類のPHP互換のシリアル化を使用する必要があります。
PHP言語とは関係なく、シリアル化はデータ変換とマッピングであるため、代償が伴います。文字列(バイナリ)情報との間で転置する必要のある大量のデータがある場合は、その処理とメモリが必要になります。
デフォルトでは、serialize
とで使用するPHPの組み込みシリアル化ですunserialize
。PHPには、2つのデフォルトのシリアル化タイプがあります。他の拡張機能も同様のものを提供します。関連する質問:
ある種のシリアル化が必要であり、非シリアル化がボトルネックであるとおっしゃっていたので、 igbinaryのような別のシリアライザーを選択することを検討できます。
ただし、PHPをフラットファイルに保存することもできます。参照してくださいvar_export
:
// storing
file_put_contents(
'name-of-data.php', '<?php return ' . var_export($data, true) . ';'
);
この例では、PHPがファイルを読み戻すことができる形式でデータを格納します。stdClassオブジェクトおよび配列の形式の構造化データに役立ちます。これを読み返すのは非常に簡単です。
// reading
$data = include('name-of-data.php');
PHPコードをデータベースに配置する場合、<?php
プレフィックスは必要ありません。
// storing
$string = 'return ' . var_export($data, true) . ';';
$db->store($key, $string);
// reading
$string = $db->read($key);
$data = eval($string);
を使用する利点はvar_export
、PHP自体を使用してデータを解析できることです。通常はserialize
/よりも高速ですunserialize
が、あなたの場合はとにかくそれを測定する必要があります。
var_export
ファイルサイズと速度の観点から、どのように動作するか試してみることをお勧めします。そしてまたigbinaryと。次に比較します。収集するときに更新された情報を質問に残しておくと、問題が解決しない場合に備えて追加の提案を行うことができます。
頭に浮かぶもう1つのことは、Json形式を使用することです。一部のデータストアはそれに最適化されているため、ストアに直接クエリを実行できます。また、map-reduce手法は、これらのデータストアの多くで使用できるため、データの処理を分散させることができます。serialize
これは、 /でまっすぐにunserialize
理解できないことです。これは、常に一度に1つの大きなデータのチャンクを処理するため、違いはありません。