如題...
匯出的資料目前大約4W條 下個月可能有10W條 4W條的情況下最終匯出大約20M 因為欄位較多所以迴圈對每一條資料做了一些處理計算, 用PHPEXCEL匯出大概3分鐘出結果 用php內建的fputcsv大約1分鐘出結果,但是因為有身份證和其他超長數字欄位, 又會變成科學計數法
用FPUTCSV的時候給每個欄位加上\t 可以避免科學計數法 但是在csv檔案中每個欄位都隱藏了雙引號 客戶無法接受
用PHPEXCEL可以指定某欄位為文字格式設定 但匯出時間太久 客戶也無法接受
目前程式迴圈本身已儘可能最佳化, 就是匯出這裡沒有辦法 希望在以下兩個方向的任意一個得到協助
1. 最佳化或者簡化PHPEXCEL的使用,使其在能滿足以上功能的情況下儘可能提高效率
2. 匯出CSV可以使長數字不以科學計數法的形式顯示,或者指定該列儲存格格式為文本
有有效思路亦可 不勝感激
回複討論(解決方案)
最佳化的一種方法:
http://bbs.youyax.com/Content-5058
假設有10000條資料,
分10次匯出,每次匯出1000條,
這種方法的好處是,可以避免長時間等待,
但是有個問題是好像還是很佔用記憶體,
檔案太大依然會報記憶體不足
原理是:
先匯出1000條,
再次讀取,定位到第1001行,
繼續匯出下1000條,
再次讀取,定位到2001,
……
最佳化的一種方法:
http://bbs.youyax.com/Content-5058
假設有10000條資料,
分10次匯出,每次匯出1000條,
這種方法的好處是,可以避免長時間等待,
但是有個問題是好像還是很佔用記憶體,
檔案太大依然會報記憶體不足
原理是:
先匯出1000條,
再次讀取,定位到第1001行,
繼續匯出下1000條,
再次讀取,定位到2001,
……
總耗時如果不減少的話意義不是很大~~
最佳化的一種方法:
http://bbs.youyax.com/Content-5058
假設有10000條資料,
分10次匯出,每次匯出1000條,
這種方法的好處是,可以避免長時間等待,
但是有個問題是好像還是很佔用記憶體,
檔案太大依然會報記憶體不足
原理是:
先匯出1000條,
再次讀取,定位到第1001行,
繼續匯出下1000條,
再次讀取,定位到2001,
……
總耗時如果不減少的話意義不是很大~~
把你的方法或代碼貼出來看看,研究研究,口說有點不清晰
1.Excel可以支援100萬行記錄,Excel 2003最大支援65536行,從2007版開始支援104萬行,Excel極限是65536條。
參考下:迴圈產生CSV 資料, 每產生1000 條的時候重新整理下緩衝期
$fp = fopen('php://output', 'a');// 輸出Excel列名資訊$head = array("電子郵件");foreach ($head as $i => $v) { // CSV的Excel支援GBK編碼,一定要轉換,否則亂碼 $head[$i] = iconv('utf-8', 'gbk', $v);}// 將資料通過fputcsv寫到檔案控制代碼fputcsv($fp, $head);// 計數器$cnt = 0;// 每隔$limit行,重新整理一下輸出buffer,不要太大,也不要太小$limit = 100000;// 逐行取出資料,不浪費記憶體$count = count($email);for($t=0;$t<$count;$t++) { $cnt ++; if ($limit == $cnt) { //重新整理一下輸出buffer,防止由於資料過多造成問題 ob_flush(); flush(); $cnt = 0; } $row[] = $email[$t]; foreach ($row as $i => $v) { $row[$i] = iconv('utf-8', 'gbk', $v); } fputcsv($fp, $row); unset($row);}2.長數字,可以再匯出的時候,在前面預加個空格,這個就不以長度計數形式匯出,而是以文本形式匯出。
目前尚無很好的辦法, PHPexcel總是很慢 未能成功最佳化