V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JungleHi
V2EX  ›  问与答

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

  •  
  •   JungleHi · 2016-03-03 13:04:30 +08:00 · 1761 次点击
    这是一个创建于 3188 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    6 条回复    2016-03-03 18:39:23 +08:00
    skydiver
        1
    skydiver  
       2016-03-03 13:20:23 +08:00
    sed
    explon
        2
    explon  
       2016-03-03 13:22:33 +08:00
    按照字节读取,替换后写入
    zhs227
        3
    zhs227  
       2016-03-03 13:31:03 +08:00
    直接用 shell + 管道,比如 sed, grep,awk 之类的。

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

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

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

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

    事实上如果你不想更改太多程序架构的话,可以先试着去掉数组话的步骤,因为 PHP 的数组开销比较大。或许你去掉数组那个步骤之后,发现内存刚好就够了。
    JungleHi
        5
    JungleHi  
    OP
       2016-03-03 16:26:51 +08:00
    谢谢各位 找到一个折中办法 向后移动插入点以后的内容
    http://bbs.csdn.net/topics/340241761
    如果新数据长度小于原数据 可以加空格之类的实现完全替换 或者不替换将原数据保留为历史版本
    JungleHi
        6
    JungleHi  
    OP
       2016-03-03 18:39:23 +08:00
    CSDN 那个方法大文件也不行 10 分钟都没有处理完。。。
    只能用 shell 了么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5057 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:58 · PVG 11:58 · LAX 19:58 · JFK 22:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.