читать более 1000 текстовых файлов в основном php - PullRequest
0 голосов
/ 20 марта 2019

У меня есть 1000 плюс текстовые файлы с именами файлов в качестве имен пользователей.Теперь я читаю это с помощью цикла.Вот мой код

for($i=0; $i<1240; $i++){                       
    $node=$users_array[$i];                     
    $read_file="Uploads/".$node."/".$node.".txt";                                
    if (file_exists($read_file)) {

        if(filesize($read_file) > 0){       
            $myfile = fopen($read_file, "r");                           
            $file_str =fread($myfile,filesize($read_file));                         
            fclose($myfile);  
        }
    }
}

, когда цикл запускается, это занимает слишком много времени и время сервера истекло.

Я не знаю, почему это занимает столько времени, потому что в файлах не так много данных.читать весь текст из текстового файла должно быть быстро.я прав?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Похоже, у вас проблема с 1000+ файлами в одном каталоге. В традиционной файловой системе Unix поиск одного файла по имени требует сканирования записей каталога по одному. Если у вас есть список файлов и вы пытаетесь прочитать их все, потребуется около 500000 записей каталога, и это будет медленно. Это алгоритм O (n ^ 2), и он будет только ухудшаться по мере добавления файлов.

Более новые файловые системы имеют опции для обеспечения более эффективного доступа к каталогам (например, https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories), но если вы не можете / не хотите изменять параметры файловой системы, вам придется разделить ваши файлы на каталоги.

Например, вы можете взять первые две буквы имени пользователя и использовать их в качестве каталога. Это не очень хорошо, потому что вы получите неравномерное распределение, лучше будет использовать хеш, но тогда будет трудно найти записи вручную.

В качестве альтернативы вы можете перебирать записи каталога (с помощью opendir и readdir) и проверять, совпадают ли имена файлов с вашими пользователями, и оставлять проблемы, связанные с созданием огромного каталога, позже.

В качестве альтернативы рассмотрите возможность использования базы данных для своего уровня хранения.

0 голосов
/ 20 марта 2019

Что ж, вы выполняете операции чтения на жестком диске / твердотельном накопителе, которые не так быстры, как память, поэтому следует ожидать большого времени работы в зависимости от размера текстовых файлов. Вы можете попробовать следующее:

  • если вы запускаете скрипт из браузера, я рекомендую запустить его из командной строки, таким образом вы не получите тайм-аут веб-сервера, и скрипт сможет завершиться, если на php не установлено ограничение по времени выполнения, case в котором, возможно, вы должны увеличить его
  • в приведенном выше сценарии вы можете установить переменную filesize ($ read_file) в переменную, чтобы не выполнять ее дважды, это может улучшить выполнение сценария
  • если вы все еще не можете закончить работу, попробуйте запустить ее партиями по 100 или 500
  • следите за использованием памяти, может быть поэтому сценарий умирает
  • если вам нужно содержимое файла в виде строки, вы можете попробовать "file_get_contents" и, возможно, пропустить проверку "fileize" вместе
...