第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何提高 PHP 中 for 循環(huán)的速度?

如何提高 PHP 中 for 循環(huán)的速度?

PHP
子衿沉夜 2023-07-07 10:31:09
我有一個包含不同行的 CSV 文件:;0;1;0;4;5;M;468468;A1101;00900;1; 0;4;5;M;468468;A1108;0090例如,在照片文件夾中,第一個視圖的命名格式必須為“A1101_0090-1.JPG”。我寫了一段代碼,它可以讓你做兩件事:csv 文件和照片文件夾中存在的圖像的名稱以及視圖數(shù)照片文件夾中但不在 csv 文件中或被錯誤重命名的圖像的名稱。我的腳本可以工作,但是當我放置一個包含超過 5000 張照片的大照片文件夾時,處理時間非常長......我該如何改進我的代碼?<?phpecho '<pre>';$dataImage = [];$dataImageTmp = [];$path = $_POST['path'];$photos = scandir($path);$photos = array_map('strtoupper', $photos);if (($handle = fopen("../RC_PRODUCT_HUB.csv", "r")) !== FALSE) {    $firstLine = true;    while (($data = fgetcsv($handle, 9000000, ";")) !== FALSE){        if (!$firstLine){            if ($data[0] != null) {                $countImage = count(glob($path . $data[6] . '_' . $data[7] . '*.*'));                for ($i = 0; $i <= $countImage; ++$i) {                    if ((file_exists($fileName = $path.$data[6].'_'.$data[7].'-'.$i.'.JPG'))){                        if (!in_array($fileName, $dataImage)){                            $dataImage[$data[6] . '_' . $data[7]]['file'][$i] = $fileName;                            $fileName = str_replace($path, '', $fileName);                            if (!in_array($fileName, $dataImageTmp)){                                $dataImageTmp[] = $fileName;                            }                        }                        $dataImage[$data[6] . '_' . $data[7]]['TOTAL'] = $countImage;                    }                }            }        }        $firstLine = false;    }     //FIRST PART    echo count($dataImage)." refs founds.<br>";    print_r($dataImage).'<br>';    //SECOND PART    $dataImageTmp = array_map('strtoupper', $dataImageTmp);     $resultat = array_diff($photos, $dataImageTmp);    $element = '.';    unset($resultat[array_search($element, $resultat)]);    $element2 = '..';    unset($resultat[array_search($element2, $resultat)]);    echo count($resultat)." photos found.<br>";    foreach ($resultat as $result) {        echo ($result) . '<br>';    }}?>
查看完整描述

2 回答

?
大話西游666

TA貢獻1817條經(jīng)驗 獲得超14個贊

別打電話glob()。只需使用一個循環(huán)來處理按數(shù)字順序匹配模式的每個文件。當文件不存在時,您可以停止循環(huán)。


我假設(shè)您的文件名數(shù)字序列中沒有間隙。


if (($handle = fopen("../RC_PRODUCT_HUB.csv", "r")) !== FALSE) {

    fgets($handle); // skip header line

    while (($data = fgetcsv($handle, 9000000, ";")) !== FALSE){

        if ($data[0] != null) {

            for ($i = 1; file_exists($fileName = $path.$data[6].'_'.$data[7].'-'.$i.'.JPG'); ++$i) {

                if (!in_array($fileName, $dataImage)){

                    $dataImage[$data[6] . '_' . $data[7]]['file'][$i] = $fileName;

                    $fileName = str_replace($path, '', $fileName);

                    if (!in_array($fileName, $dataImageTmp)){

                        $dataImageTmp[] = $fileName;

                    }

                }

                if (isset($dataImage[$data[6] . '_' . $data[7]]['TOTAL'])) {

                    $dataImage[$data[6] . '_' . $data[7]]['TOTAL']++;

                } else {

                    $dataImage[$data[6] . '_' . $data[7]]['TOTAL'] = 1;

                }

            }

        }

    }


查看完整回答
反對 回復 2023-07-07
?
Helenr

TA貢獻1780條經(jīng)驗 獲得超4個贊

需要注意的一些事項:

  • 為什么先count(glob(..))循環(huán)查找文件名(?file_exists)?您只需glob($path . $data[6] . '_' . $data[7] . '*.JPG')獲取文件名即可。您的解決方案首先創(chuàng)建一個所有文件名的數(shù)組,對其進行計數(shù),然后丟棄它并為文件名創(chuàng)建一個全新的數(shù)組。

    您可以迭代 返回的數(shù)組glob,然后$i根據(jù)需要從文件名中提取。

  • 如果需要count(glob(..)),可以用 shell 命令替換它。我認為它們會更快,因為它們不需要 PHP 中的內(nèi)存分配/釋放。

    類似的東西shell_exec("ls '{$path}{$data[6]}_{$data[7]}*.*' | wc -l")。當然,這是針對基于 *nix 的系統(tǒng)和bash/sh.?您可以在其他操作系統(tǒng)(或 shell)中找到類似的東西。

  • 您可以以某種方式分割文件,并使用多個腳本來處理它們。該解決方案可能會有很大差異,具體取決于您想要的復雜程度。喜歡:

    • 預先拆分 csv 文件,然后對其運行腳本,然后合并結(jié)果。

    • 編寫一個腳本來讀取 csv 并運行多個進程,將 csv 文件的某些部分交給每個進程進行處理,然后合并結(jié)果。流程或類似的庫在這里可能很有用。

    • 使用作業(yè)隊列。腳本讀取 csv 文件并為每一行(也許不是每一行,而是每 100 行)創(chuàng)建一個作業(yè)。作業(yè)由多個工作人員處理,結(jié)果保存在數(shù)據(jù)庫或其他內(nèi)容中以進行合并。有一些解決方案,但我只在 Laravel 或 Symfony 等有自己的作業(yè)隊列的框架中使用它們。搜索一下php job queue,你會找到一些解決方案。


查看完整回答
反對 回復 2023-07-07
  • 2 回答
  • 0 關(guān)注
  • 206 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號