[請益] 大到不能用 explode 處理的字串

看板PHP作者 (酒池肉林夜夜生科)時間13年前 (2011/05/29 17:29), 編輯推噓3(3017)
留言20則, 6人參與, 最新討論串1/1
我的檔案大概是像這樣 (其實就是純文字版的 .xls) Time P_MEM X Y Z DEST_ID 0.000000 -88.654973 0 0 0 0 0.000000 -88.654973 1 0 0 1 0.000000 -88.654973 2 0 0 2 0.000000 -88.654973 3 0 0 3 但由於檔案極大 本來想用一行一行 fgets 處理的方法會跑到超時 (60s) 於是只好用 $buffer = file_get_contents("$filename"); 的方法去讀 瞬間就成功讀取到也能 echo 出來 接著想要一行一行處理時 用 $buffer = explode("\n", $buffer); 他卻會說記憶體空間不夠他 explode: Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 1048576 bytes) 請問有沒有 function 是可以讓 $buffer 一行一行吐出來到另一個字串處理的? (處理過的字串則從 $buffer 前面去掉) 感謝大大幫忙!! -- 想你的時候 不一定能告訴你 如果不告訴你 也能會意 那我們就是有 真正的默契 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.48.199

05/29 17:39, , 1F
用C的老方法fscanf() ??
05/29 17:39, 1F

05/29 18:09, , 2F
fscanf 好像不會比 fgets 快耶 QQ
05/29 18:09, 2F

05/29 18:28, , 3F
改php.ini或者是直接 ini_set('memory_limit', 'XXXM');
05/29 18:28, 3F

05/29 18:28, , 4F
不過這不是治標的方法,如果只做一次就這樣用
05/29 18:28, 4F

05/29 18:29, , 5F
如果這是寫一套要用很久的系統的話就...換方法做吧 :D
05/29 18:29, 5F

05/29 18:30, , 6F
的確是要用非常久的系統...另外那些資料是模擬的結果
05/29 18:30, 6F

05/29 18:31, , 7F
所以減少資料量這方法等於是要犧牲準度所以不可行 @@"
05/29 18:31, 7F

05/29 21:01, , 8F
(用php)先將資料切成數量不等的檔案存起來再一一做呢?
05/29 21:01, 8F

05/29 21:03, , 9F
其實我不懂為啥這種大量的處理為什麼要用php做啦XD
05/29 21:03, 9F

05/29 21:13, , 10F
話說set_time_limit沒用嗎?
05/29 21:13, 10F

05/29 21:13, , 11F
我是指超時的問題
05/29 21:13, 11F

05/29 22:19, , 12F
我只是因為怕不知道會不會有副作用 所以不敢動設定 @@"
05/29 22:19, 12F

05/30 03:11, , 13F
用file()不就直接讀成一個陣列了 -_-#
05/30 03:11, 13F

05/30 08:02, , 14F
資料大到這種程度 調整超時還是必要的 set_time_limit
05/30 08:02, 14F

05/30 08:02, , 15F
不會動到設定吧? 就只有那個程式而已
05/30 08:02, 15F

05/30 19:58, , 16F
問題解決了 感謝各位
05/30 19:58, 16F

05/30 19:59, , 17F
我用 substr 先切過 $buffer 的資料後就可以 explode 了
05/30 19:59, 17F

05/30 20:00, , 18F
另外超時的問題題是做了太沒效率的字串操作
05/30 20:00, 18F

05/30 20:01, , 19F
修改了一下字串累加的方法後速度就夠快到不會超時了
05/30 20:01, 19F

06/01 01:59, , 20F
先切割成小單元再處理.效能會比一個大檔快很多.
06/01 01:59, 20F
文章代碼(AID): #1DuX7aSW (PHP)