599 Stimmen

Schnelles Erstellen einer großen Datei auf einem Linux-System

Wie kann ich schnell eine große Datei auf einem Linux ( Red Hat Linux ) System?

dd wird die Aufgabe erfüllen, aber das Lesen von /dev/zero und das Schreiben auf das Laufwerk kann sehr lange dauern, wenn Sie eine mehrere hundert GB große Datei für Tests benötigen... Wenn Sie das wiederholt tun müssen, summiert sich die Zeit wirklich.

Der Inhalt der Datei ist mir egal, ich möchte nur, dass sie schnell erstellt wird. Wie lässt sich das bewerkstelligen?

Die Verwendung einer spärlichen Datei ist dafür nicht geeignet. Der Datei muss Speicherplatz zugewiesen werden.

5voto

Alex Dupuy Punkte 5764

Das GPL mkfile ist nur ein (ba)sh-Skript-Wrapper um dd herum; BSD's mkfile setzt einfach einen Puffer mit ungleich Null und schreibt ihn wiederholt. Ich würde nicht erwarten, dass ersteres besser ist als dd. Letzteres könnte dd if=/dev/zero leicht übertreffen, da es die Lesevorgänge auslässt, aber alles, was signifikant besser ist, erzeugt wahrscheinlich nur eine spärliche Datei.

In Ermangelung eines Systemaufrufs, der tatsächlich Speicherplatz für eine Datei alloziert, ohne Daten zu schreiben (und Linux und BSD haben das nicht, wahrscheinlich auch Solaris), können Sie eine kleine Leistungsverbesserung erzielen, indem Sie ftrunc(2)/truncate(1) verwenden, um die Datei auf die gewünschte Größe zu erweitern, die Datei in den Speicher zu mappen und dann Daten, die nicht Null sind, in die ersten Bytes jedes Festplattenblocks zu schreiben (verwenden Sie fgetconf, um die Festplattenblockgröße zu ermitteln).

4voto

paxdiablo Punkte 809679

Ein Ansatz: Wenn Sie sicherstellen können, dass nicht verwandte Anwendungen die Dateien nicht in Konflikt miteinander verwenden, erstellen Sie einfach einen Pool von Dateien unterschiedlicher Größe in einem bestimmten Verzeichnis und erstellen Sie dann bei Bedarf Links zu diesen Dateien.

Sie haben zum Beispiel einen Pool von Dateien mit dem Namen:

  • /home/bigfiles/512M-A
  • /home/bigfiles/512M-B
  • /home/bigfiles/1024M-A
  • /home/bigfiles/1024M-B

Wenn Sie dann eine Anwendung haben, die eine 1G-Datei namens /home/oracle/logfile benötigt, führen Sie ein " ln /home/bigfiles/1024M-A /home/oracle/logfile ".

Befindet sie sich in einem anderen Dateisystem, müssen Sie einen symbolischen Link verwenden.

Die A/B/etc-Dateien können verwendet werden, um sicherzustellen, dass es keine Nutzungskonflikte zwischen nicht miteinander verbundenen Anwendungen gibt.

Die Verknüpfung ist so schnell, wie man nur sein kann.

3voto

user79878 Punkte 727

Das ist das Schnellste, was ich tun konnte (und das ist no fast) mit den folgenden Einschränkungen:

  • Das Ziel der großen Datei ist es, eine Festplatte zu füllen, daher kann sie nicht komprimierbar sein.
  • Verwendung des ext3-Dateisystems. ( fallocate nicht verfügbar)

Das ist der Kern der Sache...

// include stdlib.h, stdio.h, and stdint.h
int32_t buf[256]; // Block size.
for (int i = 0; i < 256; ++i)
{
    buf[i] = rand(); // random to be non-compressible.
}
FILE* file = fopen("/file/on/your/system", "wb");
int blocksToWrite = 1024 * 1024; // 1 GB
for (int i = 0; i < blocksToWrite; ++i)
{
   fwrite(buf, sizeof(int32_t), 256, file);
}

In unserem Fall handelt es sich um ein eingebettetes Linux-System, und das funktioniert gut genug, aber wir würden etwas Schnelleres bevorzugen.

Zu Ihrer Information: Der Befehl dd if=/dev/urandom of=outputfile bs=1024 count = XX war so langsam, dass sie unbrauchbar war.

2voto

stefan Punkte 647

Schamlose Werbung: OTFFS bietet ein Dateisystem, das beliebig große (naja, fast. Exabytes ist die aktuelle Grenze) Dateien mit generierten Inhalten bereitstellt. Es ist nur für Linux, nur in C und in einer frühen Alpha-Phase.

Siehe https://github.com/s5k6/otffs .

-2voto

TarithJ Punkte 21

Sie könnten verwenden https://github.com/flew-software/trash-dump Sie können Dateien beliebiger Größe und mit zufälligen Daten erstellen

Hier ist ein Befehl, den Sie nach der Installation von trash-dump ausführen können (erstellt eine 1 GB große Datei)

$ trash-dump --filename="huge" --seed=1232 --noBytes=1000000000

Übrigens habe ich sie erstellt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X