PHP substr_replace 修改大文件内存不够用怎么办?

2016-03-03 13:04:30 +08:00
 JungleHi

弄了个记事本,数据存在本地文件 data.txt 每条记录用<hr>分隔,数组化后用 substr_replace 编辑某条信息,但发现文件过大太费资源了,比如 1G 时内存根本不够。现在想把 data.txt 按 10M 分为 N 段,还是用 substr_replace 来编辑,再用 cat 合并文件,但也好费资源,有没有更好的办法?

1758 次点击
所在节点    问与答
6 条回复
skydiver
2016-03-03 13:20:23 +08:00
sed
explon
2016-03-03 13:22:33 +08:00
按照字节读取,替换后写入
zhs227
2016-03-03 13:31:03 +08:00
直接用 shell + 管道,比如 sed, grep,awk 之类的。

纯文本存大量数据不是很科学,一是并发的时候容易造成脏读,二是读取效率低。

PHP 写了很多懒人函数来处理文件,基本的思路都是一次把所有文件内容读进来。但是如果像你这种情况,应该使用更低级一些的 API ,比如 fgets,fread 之类的,读一点,处理一点。

最好还是存到数据库里
raincious
2016-03-03 13:33:37 +08:00
用 fopen 来读这个文件,一个个把字符迭代出来然后用搜索算法比如 KMP 找到下一个<hr>。

每当找到一个<hr>就立即进行处理,然后保存,不要进行数组化。

事实上如果你不想更改太多程序架构的话,可以先试着去掉数组话的步骤,因为 PHP 的数组开销比较大。或许你去掉数组那个步骤之后,发现内存刚好就够了。
JungleHi
2016-03-03 16:26:51 +08:00
谢谢各位 找到一个折中办法 向后移动插入点以后的内容
http://bbs.csdn.net/topics/340241761
如果新数据长度小于原数据 可以加空格之类的实现完全替换 或者不替换将原数据保留为历史版本
JungleHi
2016-03-03 18:39:23 +08:00
CSDN 那个方法大文件也不行 10 分钟都没有处理完。。。
只能用 shell 了么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/260779

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX