簡體   English   中英

了解 MySQL 的內存使用情況導致 PHP (PDO)

[英]Understanding memory usage of MySQL result in PHP (PDO)

我試圖理解為什么單個 PDO 結果的內存使用率如此之高。 以下是有關查詢/結果的一些信息:

  • 我從單個表中提取單個VARCHAR(6)
  • 結果少於 30K 行
  • 獲取此結果在 PHP 中使用 ~12MB 內存(來源: memory_get_usage
  • 如果我對結果進行json_encode並將其轉儲到文件中,則實際數據(以文本形式)僅為 ~1MB
  • 使用 PHP7,MySQL 5.7,部署在 Ubuntu 14.04 上。

我的問題是,11MB 的膨脹究竟從何而來? 如果文本形式的實際數據只有 1MB 左右,那么 11MB 的開銷對於在 PHP 中解析數據來說似乎是很大的開銷。 是否有一個原因? 我錯過了什么嗎?

編輯:

只是為了澄清,我正在尋找有關為什么存在膨脹的技術解釋,而不是該問題的解決方法。

如果沒有看到您的特定代碼,很難給出具體答案。 也就是說,像數組這樣的 PHP 數據結構是關聯的。 PHP 設計者有意權衡使用額外的 RAM 以節省訪問數組的時間。

您可以通過多種方式節省內存。 一方面,您可以將結果集的每一行提取為數字,而不是關聯數組。 讀這個。 http://php.net/manual/en/mysqli-result.fetch-array.php

另一方面,PHP 會一次性刪除結果集中的所有行,除非您告訴它不要這樣做。 這種 slurp 操作會消耗大量 RAM。 如果您計划一次處理一行大型結果集,則不需要它。 你需要一個無緩沖的查詢來做到這一點。 閱讀: http : //php.net/manual/en/mysqlinfo.concepts.buffering.php

好的,感謝 Ollie Jones 的回答,我意識到我一直在錯誤的地方尋找我的信息。 這不是 PDO 內存使用問題,而是 PHP 存儲數組方式的問題。 (也許問題不是正確的詞,它就是這樣)

經過一番挖掘,我發現了這篇非常有用的文章,其中詳細介紹了 PHP 如何為數組元素分配內存:

https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html

劇透警報,它為每個元素使用 TON 內存。 顯然它在 PHP7 中變得更好了。 文章指出,對於一個簡單的整數數組(在 PHP5 中)元素,它將使用比整數本身的大小多 18 倍的內存。 由於我看到關聯字符串數據增加了 12*,因此我認為這確實比 PHP5 有了很大的改進。

根據文章,正在為以下內容分配內存:

  • zvalue_value聯合,與 PHP 允許的弱類型轉換有關
  • 類型存儲和垃圾收集數據
  • Zend 內存管理器分配
  • 哈希表桶

如果您對此也有興趣,我強烈建議您閱讀那篇文章,它可以快速閱讀並且包含很多重要信息。

再次感謝 Ollie Jones 為我指明了正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM