我如何保存我非常複雜的對象,而不序列化他們,或者我如何才能讓我的反序列化速度更快?
如果你需要的是不是PHP對象stdClass
(你旁邊有數據成員的類定義),你需要使用任何一種PHP兼容系列化。
獨立於PHP語言,序列化帶有價格,因爲它是數據轉換和映射。如果您有大量數據需要從字符串(二進制)信息轉換而來,則需要處理和存儲。
默認情況下,PHP的內置序列化與serialize
和unserialize
一起使用。 PHP提供兩種默認的序列化類型。其他擴展提供類似的東西。相關問題:
正如你所說,你需要某種形式的序列化和反序列化是瓶頸,您可以考慮選擇其他串行像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。然後比較。收集它時請留下最新的信息與您的問題,所以如果這不能解決您的問題,可以提供其他建議。
想到的另一件事是使用Json格式。有些數據存儲已針對它進行了優化,因此您可以直接查詢商店。此外,map-reduce方法可以用於許多這些數據存儲,因此您可以擴展數據的處理。這是因爲它一次只處理一大塊數據,所以你不能直接使用serialize
/unserialize
,這是不能改變的。
你可以嘗試更好地解釋這種情況。你的序列化是什麼?爲什麼? – Gordon
這是一個有趣的問題,但正如戈登所說 - 你能給我們提供更多的信息嗎?您是否反序列化您通過file_get_contents獲取的數據?您是在同一臺機器上抓取的文件還是通過file_get_contents遠程抓取它們? –
如果序列化是你的瓶頸,請切換到[igbinary serialization](http://pecl.php.net/package/igbinary),它的速度更快。否則,請採用不需要將所有數據都拉入到php內存空間的文件格式(例如sqlite或xml)。但這正是@戈登所要求的。小心輕放。 – hakre