2011-05-03 69 views
1

我無法允許用戶從數據庫下載大型報告。使用來自mysql的大量數據

用戶有能力瀏覽網站上的報告,我已經設置了頁面的限制和分頁,所以沒有問題。

但是現在我正在添加功能來一次下載整個報告在一個csv文件。我收到內存錯誤,說我已達到允許的最大內存,並且我沒有在服務器上增加它的權限。有誰知道如何才能做到這一點?到目前爲止,只有獲得700k結果的查詢纔會停止我的腳本。

ps我有搜索周圍的計算器,到目前爲止找不到答案。我使用php和mysql來獲取數據。

在此先感謝

回答

0

就像@symbcbean所說的那樣,創建文件並在每個查詢偏移處附加數據的過程非常緩慢。所以我想出了一個替代方案,我認爲我應該分享以防別人面臨同樣的問題。

我已經設置了一個cronjob,它會在晚上創建包含所有必要數據的文件的過程,因爲數據每週只能更改幾次。所以現在我已經清除了每次有人需要訪問它時生成一個新的csv的開銷,相反,我只是重定向到預製的文件,工作就完成了!

謝謝@Gaurav & @symbcbean!

3

不要在一個請求導出全部數據。

在從數據庫導出數據時應用一些限制和偏移量。

像:

    在第一
  • 去它將從 數據導出0到9999,追加到CSV,並重定向到相同的URL,在第二偏移= 10000和限制= 10000
  • 去會出口數據從10000到19999,並追加到CSV,並重定向到相同的URL與偏移= 20000和限制= 10000
+0

我該如何重定向?如果我已經發送了頭文件下載,它需要全部在一個文件中。 – Ibu 2011-05-03 07:47:48

+0

你的腳本必須在url上工作。我的意思是如果我點擊某個鏈接,它應該導出數據。最初的10000條記錄。然後再將標題設置爲與上一個鏈接相同的網址。但現在抵消將有所不同。如果所有記錄都已導出,請下載所需的文件。 – Gaurav 2011-05-03 09:12:37

+0

這看起來可以暫時解決問題,但這種方法不會改變MySQL返回的結果集的大小(並且在執行查詢時映射到PHP內存空間中 - 檢索單個行的函數/方法在本地副本 - 他們不回去DBMS) – symcbean 2011-05-03 10:24:47

1

按我的評論Guarav的回答,您可以一次只能從數據庫中獲取大量數據 - 無論您以後如何操作它都有多聰明。

必須要麼

  • 限制在單一操作從MySQL獲取的數據量 - 可能kepp重複,直到你已經完整的數據集 - 作爲Guarav建議你需要保持PHP文件的內存空間之外的數據會重定向到它。但鑑於該進程將是緩慢的已經這不是一個可擴展的解決方案無論是

我如何可以重定向?如果我已經發送

這是微不足道的 - 如果您在理解如何做到這一點時遇到問題,那麼您已經大大超出了您的深度。

  • 另外,您可以生成報告的Web服務器的PHP之外,但如果你沒有權限配置Web服務器,那麼你可能無法運行任何程序。
0

可以將數據添加到一堆記錄的文件 喜歡的東西: 獲得第10000記錄從MySQL 寫第10000記錄到文件 獲取每秒鐘10000個記錄 寫第二個10000記錄到文件 然後箱子鏈接,發送給用戶。