zoukankan      html  css  js  c++  java
  • 查找两个大文件(1G以上)的相同内容PHP版

    这是是一个大文件处理,面试官出题的意图并不希望你两层for循环进行遍历,这种答案肯定是不会要的!

    这道题目的解法思路是:

    1. 顺序读取两个文件的的全部记录
    2. 将每条记录经过hash->转换为10进制->%n后存到10个文件中,这样一共2G的数据分成10份,每份就是204.8M,低于内存限制
    3. 我可以一次读取一个文件,并用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;
            }
        }
    
    }
  • 相关阅读:
    中文和英文
    文件字符流
    Java IO File
    关于整数拆分的递归法与母函数法
    图论·Dijkstra·HDU2066
    图论·Floyd算法·HDU2544&1874 (伪)2066
    关于 图论·并查集·HDU1232&1856
    Power of Cryptography
    Y2K Accounting Bug
    整数划分
  • 原文地址:https://www.cnblogs.com/datang6777/p/10820575.html
Copyright © 2011-2022 走看看