Ich habe das Suchverzeichnis getestet, das maximal Inodes benötigt, und während des Testens war ich ausgeführt worden
touch test_{1..1391803}.txt
Aber es gibt mir einen Fehler "-bash: /usr/bin/touch: Argument list too long"
, jetzt laufe ich unter dem Befehl, aber es scheint, dass es Hugh Zeit brauchen wird
ruby -e '1.upto(1391803) { |n| %x( touch "test_#{n}.txt" ) }'
Die Frage ist also: Gibt es eine Möglichkeit, mehrere Dateien in kurzer Zeit zu erstellen? sollte ich 1 lac-Dateien pro Schleife berühren oder auf eine bessere Weise?
Testergebnis :
Nr. 1
[root@dc1 inode_test]# time seq 343409 | xargs touch
real 0m7.760s
user 0m0.525s
sys 0m4.385s
Nr. 2
[root@test-server inode_test]# time echo 'for (i=1;i<=343409;i++) i' | bc | xargs touch
real 0m8.781s
user 0m0.722s
sys 0m4.997s
Nr. 3
[root@test-server inode_test]# time printf '%s ' {1..343409} | xargs touch
real 0m8.913s
user 0m1.144s
sys 0m4.541s
Nummer 4
[root@test-server inode_test]# time awk 'BEGIN {for (i=1; i<=343409; i++) {printf "" >> i; close(i)}}'
real 0m12.185s
user 0m2.005s
sys 0m6.057s
Nr. 5
[root@test-server inode_test]# time ruby -e '1.upto(343409) { |n| File.open("#{n}", "w") {} }'
real 0m12.650s
user 0m3.017s
sys 0m4.878s
touch
sondern für denexecve()
Systemaufruf (für die kumulative Größe der Argumente und Umgebungsvariablen, die an diesen Aufruf übergeben wurden).In Ihrem Beispiel beschwert sich Bash, weil beim Erweitern
test_{1..1391803}.txt
eine zu lange Argumentbefehlszeile angezeigt wird. Die maximale Länge der Befehlszeile, die an einen Befehl übergeben werden kann, wird vom Kernel festgelegt, da derexec
Systemaufruf, der für das Starten neuer Prozesse (das Ersetzen des Programms eines vorhandenen Prozesses durch einen anderen) verantwortlich ist, diese Argumente eingeben muss Der Stapel des Prozesses und die Größe des Stapels sind begrenzt.Ich denke, der effizienteste Weg, dies zu tun, wäre, nicht
touch
jedes Mal einen neuen Prozess zu starten, wenn Sie eine Datei möchten.Sie könnten in Rubin zum Beispiel:
Auf diese Weise starten Sie nur einen Prozess, der alle Dateien erstellt, ohne dass das
touch
Programm gestartet werden muss.Dieser Befehl startet den Ruby-Interpreter. Dann erstellt Ruby eine Schleife über den Bereich
1..1391803
und ruft für jede Nummer die Funktion aufFile.open
, die denopen
Systemaufruf mit einem Dateinamen ausführt, der mit der Nummer erstellt wurde. Da der Block danachFile.open
leer ist, wird die Datei sofort geschlossen.quelle