我必须逐行读取 10 到 20 兆的 CSV 文件。file()
没用,我必须找到最快的方法。
我试过 with fgets()
,它运行良好,但我不知道每次调用它时它是否读取一个小块,或者它是否缓存一个更大的块并优化文件 I/O。我必须尝试这种fread()
方式,自己解析EOL吗?
我必须逐行读取 10 到 20 兆的 CSV 文件。file()
没用,我必须找到最快的方法。
我试过 with fgets()
,它运行良好,但我不知道每次调用它时它是否读取一个小块,或者它是否缓存一个更大的块并优化文件 I/O。我必须尝试这种fread()
方式,自己解析EOL吗?
如果可能的话,你应该使用fgetcsv()。
否则,总是有 fgets()。
对于大文件,stream_get_line 显然比 fgets 更有效。如果您为读取指定一个合理的最大长度,我看不出 PHP 必须“提前读取”才能读取一行的任何理由,正如您似乎担心的那样。
如果您想使用 CSV,那么 fgetcsv 将以更合理的格式返回结果。
您应该看一下fgetcsv()
,它会自动将逗号分隔线解析为数组。
至于运行时效率,我不知道。您必须进行快速测试,最好使用您希望稍后处理的大小的文件。但是如果 fget 我会感到惊讶???和fput???功能未经过 I/O 优化。