大家好,欢迎来到IT知识分享网。
这是是一个大文件处理,面试官出题的意图并不希望你两层for
循环进行遍历,这种答案肯定是不会要的!
这道题目的解法思路是:
- 顺序读取两个文件的的全部记录
- 将每条记录经过hash->转换为10进制->%n后存到10个文件中,这样一共2G的数据分成10份,每份就是204.8M,低于内存限制
- 我可以一次读取一个文件,并用hash桶的方式得到单个文件中的内容是否有重复,因为每条记录都经过hash处理的,所以相同的记录肯定会在同一个文件中。
/** * 将两个文件中的每条记录通过hash求余后分别存入10个文件中 * 如果某个文件太大,超过限制内存大小,则可以对其再次hash求余 */ $handler = fopen('file_a_AND_file_b', 'r'); while ($line = fgetc($handler)) { $save_to_file_name = crc32(hash('md5', $line)) % 10; file_put_contents($save_to_file_name, $line); } /** * */ $files = [ '10个文件的路径' ]; foreach ($files as $file) { $handler = fopen($file, 'r'); $tmp_arr = []; while($line = fgetc($handler)) { if(isset($tmp_arr[$line])) { file_put_contents('common_content.txt', $line); } else { $tmp_arr[$line] = true; } } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/29106.html