1. Jetzt gibt es eine 300-MB-Datei, die zeilenweise gelesen und verarbeitet werden muss (sie kann nicht idempotent gemacht werden). Ich habe jedoch Angst, dass das System während der Verarbeitung hängen bleibt und ich nicht weiß, welche Zeile ich erneut lesen soll. Ich habe Angst, dass die zuvor verarbeiteten Zeilen erneut verarbeitet werden. Ich denke jetzt darüber nach, eine Zeile zu lesen, eine Zeile zu verarbeiten und die Zeile sofort zu löschen. Wenn Sie es erneut ausführen und von Anfang an lesen, können Sie die zuvor verarbeiteten Zeilen nicht lesen. Mal sehen, ob Experten gute Lösungen haben.
//Ich möchte eine Zeile lesen und eine Zeile löschen. Oder gibt es eine bessere Lösung, um zu vermeiden, dass dieselbe Zeile zweimal ausgeführt wird?
$fp = fopen($fileName, "r");
if (!$fp) {
return -1;
}
$max = 40960; //40k
while (!feof($fp)) {
$line = fgets($fp, $max);
}
既然是规定一行一行读取的,那么何不写一个脚本把文件先拆分成多个小文件(注意命名,比如
Linux
中的split
命令),然后再写个脚本循环读取操作。我觉得你可以换个方式来实现你要的效果:你可以读取一行,处理完这行后,在这行后加个特殊的符号。循环遍历每行就能知道哪些行是被处理过的。假如你的程序挂掉,再次执行的时候,直接搜索那个特殊符号最后一次出现的地方。然后这个地方的下一行就是你该开始执行的地方了。
另外写个文件, 记录处理位置. 记行号也行, 整体文件的偏移也行.
边读边改文件, 性能太低吧.