php文件、数据处理

来源:互联网 发布:ubuntu命令 编辑:程序博客网 时间:2024/05/17 19:20

php处理数据的能力还是相当优秀的,自己的内存管理,数组、字符的底层实现机制等极大程度的提高了效率。在实际项目当中,经常会遇到一些大数据文件处理的情况,下面盘点一下我曾经踩过的坑,希望可以给大家一些帮助。

(1)在用php处理大文件的时候,经常会出现out allowed memory的情况,php默认的内存限制是128M。当我们程序运行的过程中,内存占用超过这个限度时,程序会自动退出。

 解决办法:1.通过代码修改内存限制:ini_set("memory_limit","-1");   这样设置会不限制内存,也可以将-1替换成其他值。

                   2.通过修改配置文件。修改php.ini内的memory_limit值。

                  (建议用第一种,相对灵活)

(2)巧用文件处理函数。

  file_get_contents、file_put_contents和fopen、feof、fwrite、fgetss系列函数都可以用来操作文件。但是两者有不用的适应场景。

  file_get_contents会一次性读取文件的所有内容并返回,简单粗暴,这种方式适用于小数据量文件。

  fopen会打开一个文件并将它绑定在一个流上,同时可以对文件操作进行限制(只读、写、末尾插入等),然后可以通过指针对文件进行操作。这种方式处理文件比较灵活,但是 由于按行处理的缘故,性能上不如file_get_contents;这种方式更倾向于处理大数据文件。

 注:在文件处理中,一般为保留文件格式,\t和\n是两个常用的字符,\t是水平制表符,而\n是换行符,在php处理过程中,一定要注意,使用这两个字符时一定要用双引号"",切记不能用单引号'',因为单引号内的这两个只是普通字符,无法解析。还有一点需要注意的是在文件读取过程中,一定要记得过滤换行符。

(3)百万级别以上数据入库。

在工作中经常会遇到大文件处理后大数据(百万、千万级别)入库的情况,一般处理步骤都是处理一组数据然后立马入库。但是这样的耗时一般都是巨大的,如果是离线的话还可以接受,如果碰到在线脚本处理的话,加上线上数据库集群一般为维持线上服务稳定,不可能频繁的连接、插入数据(一般策略是插入一条数据,休息两倍插入一条数据的时间),这样的话可能几天几夜也不可能完成,曾经有一次600w数据采用这种方式脚本运行两天两夜。合理的处理方式应该是拼接sql语句,并行入库,一次性组装一定数量的数据然后再去执行,我们知道一次插入的时间其实是非常短的。实际经历:1400w数据一次200条数据组装sql入库,只需要不到3分钟。但是在实际情况中也应该考虑到内存的开销,在一次运行结束后要及时释放内存。

注:缺点,在某一条数据出现错误时,没办法及时定位到出错位置。优点:速度很快