在核心php中读取超过1000个txt文件

问题描述 投票:-1回答:2

我有1000个txt文件,文件名为usernames。现在我正在使用循环阅读它。这是我的代码

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);  
        }
    }
}

当循环运行时,它需要太多时间,服务器会超时。

我不知道为什么花费那么多时间因为文件中没有太多数据。从txt文件中读取所有文本应该很快。我对吗?

php fopen
2个回答
0
投票

好吧,你正在对HDD / SSD进行读取操作,这些操作没有内存那么快,所以根据文本文件的大小,你应该期望高运行时间。您可以尝试以下方法:

  • 如果你是从浏览器运行脚本,我建议从命令行运行它,这样你就不会让web服务器超时,如果在php上没有设置时间执行限制,脚本将设法完成,例如你应该增加它
  • 在上面的脚本中,您可以将“filesize($ read_file)”设置为变量,这样您就不会执行两次,这可能会改善脚本的运行
  • 如果仍然无法完成工作,请考虑分批运行100或500
  • 密切关注内存使用情况,也许这就是脚本死亡的原因
  • 如果您需要将文件的内容作为字符串,您可以尝试“file_get_contents”,也可以跳过“filesize”一起检查所有内容

0
投票

听起来你的问题是在一个目录中有1000多个文件。在传统的Unix文件系统上,按名称查找单个文件需要逐个扫描目录条目。如果你有一个文件列表并尝试阅读所有文件,那么它将需要遍历大约500000个目录条目,而且速度很慢。这是一个O(n ^ 2)算法,它只会在你添加文件时变得更糟。

较新的文件系统具有启用更高效目录访问的选项(例如https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories),但如果您不能/不想更改文件系统选项,则必须将文件拆分为目录。

例如,您可以使用用户名的前两个字母并将其用作目录。这不是很好,因为你会得到一个不均匀的分布,最好使用哈希,但那么手动找到条目将很困难。

或者,您可以迭代目录条目(使用opendir和readdir)并检查文件名是否与您的用户匹配,并留下处理巨大目录为以后创建的问题。

或者,考虑使用数据库作为存储层。

© www.soinside.com 2019 - 2024. All rights reserved.