2015-11-27 30 views
4
數組

我的最終目標是發送300萬條記錄的谷歌地圖API來顯示爲標誌,但在此之前我去的..查詢1萬條記錄從MySQL到PHP

我一直沒能甚至可以將100萬加載到PHP數組中。數據是每個元素的18位數字,有2列和1百萬行。

查詢僅僅是一個直線上升SELECT *,但我通過循環和陣列中的存儲正確的記錄時運行內存。我試過使用SplFixedArray,但沒有任何運氣。

我需要找到一個很好的方法來批量分割它 - 運行一些測試後,我可以將大約500k拉入到一個沒有達到內存限制(已經是512M!)的數組中,所以我可以做這在2或3個查詢?在頁面加載之前,我仍然需要將全部數據保存到服務器端的數組中,並且我可以將它傳遞給Maps,所以我假設批處理不會修復它,因爲它仍然會在內存中?

編輯:有一個大的評論鏈增長,但主要是大家都同意,這是出於某種原因或其他一個壞主意。所以我的解決方案是把它拉回到大約300k點,這可以通過少得多的擊球來實現。

+1

不要這樣做.....大量的數據需要大量的內存。爲了讓你知道你需要多少內存,[閱讀此](https://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint- BIG.html)....然後停止嘗試DDOS Google Maps API –

+0

@MarkBaker所以這只是直線上漲是不可能的?不是粗魯,但我很好奇。而且我不應該進行任何DOS操作,它會將數組加載到我自己的站點上,然後將其加載到gmap中 - 我認爲這不會導致Google額外的服務器負載 – Tom

+0

如果您要求Google Maps API提供繪圖請求3000000個數據點,那麼這將被谷歌拒絕,就好像它是一次攻擊.....你遇到過任何試圖用這個數據量來做的企業嗎?有一個很好的理由,他們爲什麼不 –

回答

1

鋪設的獲取1M的記錄插入到客戶端是否是一個好主意的問題,並假定它是必要的。瞭解MySQL客戶端協議的工作原理非常重要。有兩種模式 - 一個存儲所有數據在客戶端(STORE_RESULT)與分配給整套內存設置一次,而另取一行在與分配只是當前行(USE_RESULT)內存的時間。爲避免內存問題,您的客戶需要使用USE_RESULT模式。

對於一些例子,來看看:

http://php.net/manual/en/mysqlinfo.concepts.buffering.php

你想無緩衝查詢。

2

真的沒有任何一點試圖將數百萬地圖標記泵入谷歌地圖。

它根本不是來自存儲器透視或性能的角度來看是可行的。只要想一想這些數據的大小 - 即使每個標記只是一個字節的數據,也就是3兆字節。但實際上,每個標記最少需要大約20個字節,僅用於協調和JSON標記,因此這是60兆字節,甚至在您開始爲每個標記添加描述之前。您的系統無法將這些內容傳輸到Google,因爲它們的速度足以使其在網絡上可用。即使可以,Google也不會接受您在每次有人想要查看您的地圖時向他們發送這種大量數據。

,並且在任何情況下,具有在地圖上的所有這些標記將不使用反正;他們會掩蓋整個地圖和彼此,只是弄得一團糟。

即使一次向Google發送幾百個地圖標記也會推送它。發送數百萬只不會發生。

那你能做些什麼呢?其他網站如何設法同時擁有數千萬個標記?答案很簡單 - 他們不。他們僅向正在顯示的地圖部分的Google發送標記。

在更寬的縮放級別下,您甚至不顯示標記;你會有一個預先渲染的熱圖顯示你的覆蓋範圍。在更近的縮放級別下,您只會加載正在顯示的區域的地圖引腳。隨着地圖移動,您將加載更多。

我的意思是Xfinity wifi map的一個很好的例子。他們在地圖上有數十萬個點,但從不一次加載超過幾十個標記。快速且易於管理。

+0

感謝您的深入響應,預渲染的熱圖是一個好主意,它非常符合我所需要的最終結果,所以我會再看一看 – Tom