作者bill42362 (酒池肉林夜夜生科)
看板PHP
標題[請益] 大到不能用 explode 處理的字串
時間Sun May 29 17:28:57 2011
我的檔案大概是像這樣 (其實就是純文字版的 .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
1F:→ cceHunteR:用C的老方法fscanf() ?? 05/29 17:39
2F:→ bill42362:fscanf 好像不會比 fgets 快耶 QQ 05/29 18:09
3F:→ gconline:改php.ini或者是直接 ini_set('memory_limit', 'XXXM'); 05/29 18:28
4F:→ gconline:不過這不是治標的方法,如果只做一次就這樣用 05/29 18:28
5F:→ gconline:如果這是寫一套要用很久的系統的話就...換方法做吧 :D 05/29 18:29
6F:→ bill42362:的確是要用非常久的系統...另外那些資料是模擬的結果 05/29 18:30
7F:→ bill42362:所以減少資料量這方法等於是要犧牲準度所以不可行 @@" 05/29 18:31
8F:推 mrbigmouth:(用php)先將資料切成數量不等的檔案存起來再一一做呢? 05/29 21:01
9F:→ mrbigmouth:其實我不懂為啥這種大量的處理為什麼要用php做啦XD 05/29 21:03
10F:推 mrbigmouth:話說set_time_limit沒用嗎? 05/29 21:13
11F:→ mrbigmouth:我是指超時的問題 05/29 21:13
12F:→ bill42362:我只是因為怕不知道會不會有副作用 所以不敢動設定 @@" 05/29 22:19
13F:→ MOONRAKER:用file()不就直接讀成一個陣列了 -_-# 05/30 03:11
14F:推 mrbigmouth:資料大到這種程度 調整超時還是必要的 set_time_limit 05/30 08:02
15F:→ mrbigmouth:不會動到設定吧? 就只有那個程式而已 05/30 08:02
16F:→ bill42362:問題解決了 感謝各位 05/30 19:58
17F:→ bill42362:我用 substr 先切過 $buffer 的資料後就可以 explode 了 05/30 19:59
18F:→ bill42362:另外超時的問題題是做了太沒效率的字串操作 05/30 20:00
19F:→ bill42362:修改了一下字串累加的方法後速度就夠快到不會超時了 05/30 20:01
20F:→ mirae:先切割成小單元再處理.效能會比一個大檔快很多. 06/01 01:59