PHP文件读写以及本地跑数据一些坑

来源:互联网 发布:日本人残忍知乎 编辑:程序博客网 时间:2024/06/05 22:53

文件读写

这段时间在做PHP相关的开发,经常会做PHP下的文件读写,主要用于跑数据需求。

大家平常在工作的过程中,经常会涉及到一些数据需求,这些数据常常无法通过一条sql语句完成,或者sql的查询效率会很低;相反地,我们可以将数据以高效率的方式跑到本地。例如,通过linux下的管道命令。之后,我们使用任意语言在本地做一个数据解析,可以更快地完成任务。

文件读写过程中,经常会踩的一些坑

1. 读数据时,不删除换行”\n”,这个问题看起来简单,确经常会让我们犯错,例如,现在有500W量级文章,我想了解其中包含109种tag的文章浏览量,那么对于这个问题,我们应该如何做,来看看PHP代码是如何实现的。

<?phpini_set('memory_limit', '2048M');$keyFile = fopen('./key.txt', 'r');$arrKeyWords = array();$strKey = '';while($strKey = trim(fgets($keyFile))){///这里我们使用了trim函数,来避免将\n读进键值数组的Key中,这会导致在下面使用Hash时,对应key匹配无法成功    $arrKeyWords[$strKey] = 0;}//var_dump($arrKeyWords);die();$objTaskFile = fopen('./allData', 'r');$strRow = '';while($strRow = fgets($objTaskFile)){    $arrInfo = explode("\t", $strRow);    //获取pv    $intPV = intval($arrInfo[2]);    //获取tag字符串,并用urldecode解码    $strTags = $arrInfo[1];    $strDecodedTags = urldecode($strTags);    //将tag解析为数组    $arrTags = explode(",", $strDecodedTags);    if(empty($arrTags)){        continue;    }    foreach($arrTags as $tag){        if(!isset($arrKeyWords[$tag])){            continue;        }        $arrKeyWords[$tag] += $intPV;    }    unset($intPV);    unset($strTags);    unset($arrInfo);}$strFile = fopen('./result', 'w');foreach($arrKeyWords as $key => $word){    fputs($strFile , $key . "\t" . $word . "\n");}

2. 不同的跑数据方法各有快慢,那么对于在数组中做查找时,最快的方法无疑是Hash了,对于PHP即键值数组,注意上面代码中的isset()方法。对应于Java,那就是大名鼎鼎的HashMap这个集合类了,相比较传统的查找方法,速度上可以提升非常多,之前做过测试数据,有兴趣地同学可以尝试一下。

3. 巧用分割函数,对应PHP代码中的explode和implode,可以高效的解决分隔符统一的文本问题。

上面那段文本解析地是诸如此类的数据,key.txt中存储的是要查找的关键词

2583404 %E5%81%A5%E8%BA%AB%2C%E5%BF%A0%E5%91%8A 272289115 %E6%88%B7%E5%8F%A3%2C%E8%BF%81%E5%85%A5 572551112 spss    752547769 %E5%B1%85%E4%B8%AD%2C%E5%8F%B3%E5%AF%B9%E9%BD%90    1005
0 0
原创粉丝点击