弄了个记事本,数据存在本地文件 data.txt 每条记录用<hr>分隔,数组化后用 substr_replace 编辑某条信息,但发现文件过大太费资源了,比如 1G 时内存根本不够。现在想把 data.txt 按 10M 分为 N 段,还是用 substr_replace 来编辑,再用 cat 合并文件,但也好费资源,有没有更好的办法?
1
skydiver 2016-03-03 13:20:23 +08:00
sed
|
2
explon 2016-03-03 13:22:33 +08:00
按照字节读取,替换后写入
|
3
zhs227 2016-03-03 13:31:03 +08:00
直接用 shell + 管道,比如 sed, grep,awk 之类的。
纯文本存大量数据不是很科学,一是并发的时候容易造成脏读,二是读取效率低。 PHP 写了很多懒人函数来处理文件,基本的思路都是一次把所有文件内容读进来。但是如果像你这种情况,应该使用更低级一些的 API ,比如 fgets,fread 之类的,读一点,处理一点。 最好还是存到数据库里 |
4
raincious 2016-03-03 13:33:37 +08:00
用 fopen 来读这个文件,一个个把字符迭代出来然后用搜索算法比如 KMP 找到下一个<hr>。
每当找到一个<hr>就立即进行处理,然后保存,不要进行数组化。 事实上如果你不想更改太多程序架构的话,可以先试着去掉数组话的步骤,因为 PHP 的数组开销比较大。或许你去掉数组那个步骤之后,发现内存刚好就够了。 |
5
JungleHi OP 谢谢各位 找到一个折中办法 向后移动插入点以后的内容
http://bbs.csdn.net/topics/340241761 如果新数据长度小于原数据 可以加空格之类的实现完全替换 或者不替换将原数据保留为历史版本 |
6
JungleHi OP CSDN 那个方法大文件也不行 10 分钟都没有处理完。。。
只能用 shell 了么? |