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