


(Tutorial disyorkan: Tutorial video PHP)
1 Pengenalan
Diberi dua a dan b di sana ialah dua fail, setiap satu dengan baris x dan y data (x, y kedua-duanya lebih besar daripada 1 bilion), dan memori mesin dihadkan kepada 100M Bagaimana untuk mencari rekod yang sama?
2
- Kesukaran utama dalam menangani masalah ini ialah mustahil untuk membaca data besar ini ke dalam ingatan pada satu masa
- Jika ia tidak boleh dibaca ke dalam ingatan pada satu masa masa, bolehkah ia dianggap beberapa kali? Jika boleh, bagaimana kita boleh mengira nilai yang sama selepas membacanya beberapa kali?
- Kita boleh menggunakan pemikiran divide and conquer untuk mengurangkan yang besar kepada yang kecil. Jika nilai rentetan yang sama adalah sama selepas pencincangan, maka kita boleh mempertimbangkan untuk menggunakan modulo cincang untuk menyuraikan rekod ke dalam n fail. Bagaimana untuk mendapatkan n ini? PHP mempunyai memori 100M, dan tatasusunan boleh menyimpan kira-kira 1 juta data Jadi memandangkan rekod a dan b hanya mempunyai 1 bilion baris, n mestilah sekurang-kurangnya lebih daripada 200.
- Terdapat 200 fail pada masa ini Rekod yang sama mesti berada dalam fail yang sama, dan setiap fail boleh dibaca ke dalam memori. Kemudian anda boleh mencari rekod yang sama dalam 200 fail ini secara bergilir-gilir, dan kemudian mengeluarkannya ke fail yang sama Hasil akhir ialah rekod yang sama dalam dua fail a dan b.
- Sangat mudah untuk mencari rekod yang sama dalam fail kecil Gunakan setiap baris rekod sebagai kunci jadual cincang dan kira bilangan kejadian kunci >= 2.
3. Operasi praktikal
1 bilion fail terlalu besar, dan operasi praktikal itu membuang masa sahaja.
Saiz masalah dikurangkan kepada: Had memori 1M, a dan b masing-masing mempunyai 100,000 baris rekod Had memori boleh dihadkan menggunakan ini_set('memory_limit', '1M');
PHP.
4. Jana fail ujian
Jana nombor rawak untuk mengisi fail:
/** * 生成随机数填充文件 * Author: ClassmateLin * Email: classmatelin.site@gmail.com * Site: https://www.classmatelin.top * @param string $filename 输出文件名 * @param int $batch 按多少批次生成数据 * @param int $batchSize 每批数据的大小 */ function generate(string $filename, int $batch=1000, int $batchSize=10000) { for ($i=0; $i<$batch; $i++) { $str = ''; for ($j=0; $j<$batchSize; $j++) { $str .= rand($batch, $batchSize) . PHP_EOL; // 生成随机数 } file_put_contents($filename, $str, FILE_APPEND); // 追加模式写入文件 } } generate('a.txt', 10); generate('b.txt', 10);
5 Pisahkan fail
akana.txt
, b.txt
Pisah kepada n fail dengan modulus cincangan
/** * 用hash取模方式将文件分散到n个文件中 * Author: ClassmateLin * Email: classmatelin.site@gmail.com * Site: https://www.classmatelin.top * @param string $filename 输入文件名 * @param int $mod 按mod取模 * @param string $dir 文件输出目录 */ function spiltFile(string $filename, int $mod=20, string $dir='files') { if (!is_dir($dir)){ mkdir($dir); } $fp = fopen($filename, 'r'); while (!feof($fp)){ $line = fgets($fp); $n = crc32(hash('md5', $line)) % $mod; // hash取模 $filepath = $dir . '/' . $n . '.txt'; // 文件输出路径 file_put_contents($filepath, $line, FILE_APPEND); // 追加模式写入文件 } fclose($fp); } spiltFile('a.txt'); spiltFile('b.txt');
Laksanakan fungsi splitFile
dan dapatkan 20 fail dalam direktori files
seperti yang ditunjukkan di bawah.
6. Cari rekod pendua
Sekarang kita perlu mencari rekod yang sama dalam 20 fail Malah, kita perlu mencari rekod yang sama dalam satu fail dan kendalikan setiap 20 kali.
Cari rekod yang sama dalam fail:
/** * 查找一个文件中相同的记录输出到指定文件中 * Author: ClassmateLin * Email: classmatelin.site@gmail.com * Site: https://www.classmatelin.top * @param string $inputFilename 输入文件路径 * @param string $outputFilename 输出文件路径 */ function search(string $inputFilename, $outputFilename='output.txt') { $table = []; $fp = fopen($inputFilename, 'r'); while (!feof($fp)) { $line = fgets($fp); !isset($table[$line]) ? $table[$line] = 1 : $table[$line]++; // 未设置的值设1,否则自增 } fclose($fp); foreach ($table as $line => $count) { if ($count >= 2){ // 出现大于2次的则是相同的记录,输出到指定文件中 file_put_contents($outputFilename, $line, FILE_APPEND); } } }
Cari rekod yang sama dalam semua fail:
/** * 从给定目录下文件中分别找出相同记录输出到指定文件中 * Author: ClassmateLin * Email: classmatelin.site@gmail.com * Site: https://www.classmatelin.top * @param string $dirs 指定目录 * @param string $outputFilename 输出文件路径 */ function searchAll($dirs='files', $outputFilename='output.txt') { $files = scandir($dirs); foreach ($files as $file) { $filepath = $dirs . '/' . $file; if (is_file($filepath)){ search($filepath, $outputFilename); } } }
Setakat ini, masalah ruang pemprosesan fail besar telah diselesaikan, jadi bagaimana untuk menangani masalah masa? Satu mesin boleh diproses dengan menggunakan berbilang teras CPU Jika ia tidak mencukupi, ia boleh diproses oleh berbilang pelayan.
7. Kod lengkap
(tutorial disyorkan: Tutorial video PHP)
Atas ialah kandungan terperinci Contoh terperinci tentang cara PHP mencari rekod yang sama dalam dua fail besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

Penyesuai Pelayan SAP NetWeaver untuk Eclipse
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa