PHP有限内存处理大文件(从两个文件提取相同行)

Posted SuperAvalon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP有限内存处理大文件(从两个文件提取相同行)相关的知识,希望对你有一定的参考价值。

面试题:

有两个文件文件,大小都超过了1G,一行一条数据,每行数据不超过500字节,两文件中有一部分内容是完全相同的,请写代码找到相同的行,并写到新文件中。php最大允许内内为256M。

 

解题步骤

遇到此问题,首先先尝试从小范围解决,比如题目中,要求查找两个文件相同的行,那么我们可以先读取文件到内存中(数组),然后通过array_intersect()函数获取两个数组的交集,即为相同的行,此时,小范围的问题已经找到解决方法了。

再回到问题本身,两个文件都超过1G,PHP最大使用内存是256M(也有可能是128M,甚至10M,这不用担心),在此条件下,直接读取文件到内存,显然不可行,我们可以考虑使用split命令将其分割成若干个小文件,再运用上面的思路逐个对比小文件,得到的结果,再合并到结果集里面,然后再去重,即得到题目要求。

步骤一、通过php生成两个大容量数据文件

<?php

function build_file($max)


        $file1 = fopen("/tmp/file1.txt", "w");
        $file2 = fopen("/tmp/file2.txt", "w");
        for($i =0; $i < $max; $i++) 
                $text1 = md5(microtime() . rand(100, 999)) 

以上是关于PHP有限内存处理大文件(从两个文件提取相同行)的主要内容,如果未能解决你的问题,请参考以下文章

如何处理大字符串和有限的内存

您如何在内存非常有限的嵌入式系统上处理大数据传输?

Ktor - 处理大文件操作而不会发生内存泄漏

为啥使用 php 从一个非常大的 csv 文件中只读取 1000 条记录?

php处理大文件文件

linux-统计文件中相同行的数量