【问题标题】:Object caching - is it more efficient to store cloned objects or serialized data?对象缓存 - 存储克隆对象还是序列化数据更有效?
【发布时间】:2012-04-18 04:50:49
【问题描述】:

假设我正在从数据库中加载大量对象。这些是普通的、普通的 PHP 对象,没有任何花哨的继承。假设我可能会更改其中一些对象并希望将它们写回数据库,但只使用在 UPDATE ... SET ... 查询中实际不同的字段。还假设我事先不知道要更改哪些对象。

我想我需要复制所有加载的对象,并保留以供参考和比较,如果我需要将对象写回数据库。

我看到了两种可能的方法:

  • 我可以克隆所有加载的对象并存储在单独的列表中。保存时,使用索引在列表中查找对象,然后比较值。
  • 或者,我可以简单地将加载到字符串中的所有内容序列化,然后保留。保存时,在字符串中找到序列化的对象(以某种方式),将其反序列化,比较值,然后就可以了。

在效率方面(主要是内存,但速度也是一个考虑因素),哪个比较好?

【问题讨论】:

  • 我不确定你的对象有多少个字段,但是更新对象上的所有字段都没有错,无论是只有 1 还是 2 发生了变化 - 这样你就不需要保留原件。更新 20 个字段不会比更新 2 个字段慢很多,当然除非表很大并且有索引和其他引用表。
  • @AleksG:20 个字段,50 000 个对象(一个猜测的大数字)= 1 000 000 个要更新的字段。
  • @hakre 有了这么多的更新,OP 最好在进行任何更新之前禁用所有索引。
  • 我会说加载的对象数量在 100 到 10,000 之间变化。更改的对象数量通常很少 (1-2%)。

标签: php performance serialization


【解决方案1】:

好吧,如果对象的状态发生了变化,您实际上需要比较一些东西。如果您不仅想跟踪哪个对象发生了变化,还想跟踪哪个成员发生了变化,那么您需要为每个成员设置一个状态。

由于您不想扩展原始对象(例如,它们可能具有在更改时无效的标志),因此您需要从外部跟踪状态。我会说序列化可能是最好的选择。克隆会占用更多内存。

【讨论】:

  • 跟踪状态是有意义的。我可能会在对象中注入某种“合理隐藏的字段”,这些对象只是计算每个字段的 crc-32 并存储起来……我不确定 crc-32 是否足够万无一失。
  • 哈希不安全,尤其是 CRC-32 不安全。如果考虑修改对象,如果对象被更改(修改),每个 setter 都可以设置一些状态,那么这很容易,并且需要最少的内存。
猜你喜欢
  • 2010-10-22
  • 2015-06-01
  • 2013-01-15
  • 1970-01-01
  • 2013-09-06
  • 2012-08-04
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多