Jak utworzyć plik z terminala, powtarzając nieskończenie zestaw słów? Potrzebuję go, aby utworzyć ogromny plik do analizowania, taki jak rozmiar 2-4 GB. Obecnie ręcznie kopiuję wklejanie linii do tego samego pliku, aby zwiększyć rozmiar.
command-line
Nisheet
źródło
źródło
mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done
?Odpowiedzi:
Jest prosty sposób, aby powtórzyć wiersz wiele razy:
spowoduje, że plik out.txt zawiera 10 000 wierszy, z których wszystkie mówią „nie mamy bananów”.
Aby ograniczyć wyjście do dokładnej liczby bajtów, użycia
head
jest-c
opcją zamiast-n
. Na przykład generuje dokładnie 10 kB tekstu:źródło
head -c 10000
dla 10 kB zamiasthead -n 10000
dla 10 k linii.Nie mogę polecić nieskończonego powtarzania tekstu, ale możesz utworzyć plik o wielkości ~ 2 GB z powtarzającym się tekstem z pythonem tak ...
Spowoduje to wydrukowanie „hello world” 10 razy i utworzenie nowego wiersza, i powtórzenie tego 20 000 000 razy, zapisując wynik w pliku
bigfile
. Jeśli wszystkie znaki są ASCII, to każdy ma jeden bajt, więc odpowiednio obliczyć w zależności od tego, co chcesz napisać ...Twoja jednostka centralna może być własnością. Skończy mi się pamięć RAM, jeśli spróbuję wykonać więcej niż 10 000 000 linii ...
Ale uruchamiam toster
źródło
Perl ma fajny
x
operator:Tak więc, jako proste rozwiązanie, możesz napisać swoją linię kilka milionów razy. Na przykład to polecenie utworzyło plik 3G:
Jeśli musisz podać dokładny rozmiar (w tym przypadku 2 GiB), możesz:
źródło
Umieść zestaw słów do powtórzenia w pliku np
source.txt
. Uzyskaj rozmiarsource.txt
bajtów, np. Przez:Wybierz rozmiar pliku docelowego, np.
destination.txt
2 GB lub 4 GB lub cokolwiek innego. Konwertuj rozmiar w bajtach.Podziel rozmiar pliku docelowego przez rozmiar pliku źródłowego.
bash
nie może wykonywać arytmetyki zmiennoprzecinkowej, ale w tym przypadku nie jest to konieczne.Użyj
for
konstruktu, aby powtórzyćcat source.txt
operację razy wynik podziału. Byłby to najbliższy rozmiar docelowego pliku, jaki można uzyskać przez powtórzenie. Dane wyjściowe operacji są zapisywane wdestination.txt
.Na przykład, zakładając, że
source.txt
ma on 30 bajtów i chcemy utworzyć plik o wielkości 2 GB, potrzebujemy:Tutaj ustawiam górny limit
((16777216/30))
przy czasie inicjalizacji; możesz uzyskać wynik i umieścić go tutaj.Operacja zajmie trochę czasu; im większy
source.txt
, tym mniej czasu będzie potrzebne.źródło
destination.txt
raz dla każdej iteracji pętli?Możesz także użyć
while
pętli.Przykład: Treść
foo.txt
(To jest twoje źródło):bar.txt
jest pusty (to jest twój plik docelowy). Możesz teraz wykonać następującą pętlę, aby zapisać zawartośćfoo.txt
wielokrotnie wbar.txt
:Wyjaśnienie:
stat --format "%s" bar.txt
wyświetla rozmiarbar.txt
w bajtach.while [ $(stat --format "%s" bar.txt) -lt 150 ]
następujące działania będą powtarzane, aż do osiągnięcia rozmiaru docelowego (w tym przypadku 150 bajtów).cat foo.txt >> bar.txt
dołącz zawartośćfoo.txt
dobar.txt
źródło
Najpierw wystrzel komendę:
utworzy plik na ścieżce o rozmiarze bs * zlicza losowe bajty, w naszym przypadku 2048 * 10 = 20 KB. które można zmienić zgodnie z wymaganiami.
To polecenie przekierowuje STDIN do pliku, więc musisz wprowadzić dwa wiersze, a następnie nacisnąć Ctrl + D. Następnie musisz uruchomić następujące polecenie:
Gdzie n jest liczbą całkowitą. Spowoduje to utworzenie pliku zawierającego 2 ^ (n + 1) linii, poprzez skopiowanie oryginalnych dwóch linii. Aby utworzyć plik z 16 liniami, wykonaj:
Oto kilka liczb na początek:
źródło
FIFO są prawdopodobnie tym, czego szukasz. Zamiast wywoływać program z danym plikiem, możesz powiązać z nim wynik polecenia powłoki poprzez podstawienie procesu, a program zobaczy wynik w postaci pliku jawnego tekstu. Zaletą jest to, że nie jesteś już ograniczony miejscem na dysku, dzięki czemu możesz osiągnąć rozmiary plików, które w przeciwnym razie byłyby niemożliwe, o ile twój program nie musi najpierw buforować całego pliku i może po prostu parsować go wiersz po wierszu. Na przykład użycie odpowiedzi @hobbs do wygenerowania treści:
To pożycza mi plik 95 gigabajtów (według wc) bez żadnych kosztów w przestrzeni na dysku twardym i prawie żadnej pamięci RAM, tylko tyle, aby buforować to, co komenda zwraca, zanim zostanie odczytana. Jest to tak blisko „nieskończoności”, jak tylko się da.
źródło