我有1000多个txt文件,文件名用作用户名。现在,我正在使用循环阅读它。这是我的代码
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文件读取所有文本应该很快。我对吗?
答案 0 :(得分:0)
好吧,您正在HDD / SSD上执行读取操作,但其读取速度不及内存,因此取决于文本文件的大小,您应该期望较长的运行时间。您可以尝试以下操作:
答案 1 :(得分:0)
听起来您的问题是在单个目录中有1000多个文件。在传统的Unix文件系统上,按名称查找单个文件需要逐个扫描目录条目。如果您有文件列表并尝试读取所有文件,则将需要遍历约500000个目录条目,而且速度很慢。这是一种O(n ^ 2)算法,添加文件时只会变得更糟。
较新的文件系统具有启用更有效的目录访问的选项(例如https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories),但是如果您不想/不希望更改文件系统选项,则必须将文件拆分为目录。
例如,您可以使用用户名的前两个字母并将其用作目录。这不是很好,因为您将获得不均匀的分布,最好使用散列,但是这样一来,手工查找条目将很困难。
或者,您可以迭代目录条目(使用opendir和readdir),并检查文件名是否与您的用户匹配,然后再处理庞大目录为以后创建的问题。
或者,考虑在存储层中使用数据库。