Как создать файл с терминала, который бесконечно повторяет набор слов?

Как создать файл из терминала, бесконечно повторяя набор слов? Мне нужно создать огромный файл для синтаксического анализа размером 2-4 ГБ. В настоящее время я вручную копирую вставляя строки в один и тот же файл, чтобы увеличить размер.

1
задан 27 September 2016 в 08:55

6 ответов

Я не могу рекомендовать бесконечно повторяющийся текст, но вы могли бы сделать файл с повторяющимся текстом ~ 2 ГБ с помощью python, так ...

python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'

Это будет печатать «привет мир» 10 раз и введите новую строку и повторите это 20 000 000 раз, записывая результат в файл bigfile. Если все ваши символы ASCII, то каждый из них один байт, поэтому рассчитывайте соответственно в зависимости от того, что вы хотите записать ...

Возможно, ваш процессор. У меня заканчивается RAM, если я пытаюсь выполнить более 10 000 000 строк ...

Я запускаю тостер, хотя

10
ответ дан 23 May 2018 в 05:43
  • 1
    OP хочет иметь дело с байтами, а не с линиями. – heemayl 27 September 2016 в 12:38
  • 2
    @heemayl, конечно, ваш ответ лучше, но я (неопределенно) объяснил, как рассчитать, сколько строк использовать для получения желаемых байтов, поэтому я не думаю, что мой ответ абсолютно бесполезен – Zanna 27 September 2016 в 12:40
  • 3
    @heemayl, что заставляет вас быть уверенным, что OP хочет байты? В основном вопрос заключается в том, что OP хочет большой файл. Конкретный размер очень расплывчатый (2-4 ГБ), поэтому я действительно сомневаюсь, что есть конкретный предел байта. – terdon♦ 27 September 2016 в 13:23
  • 4
    @heemayl да, но это очень, очень расплывчато. Я понимаю, что OP просто хочет большой файл и не заботится о точном размере. В противном случае они дали бы размер вместо такого огромного диапазона размеров. – terdon♦ 27 September 2016 в 13:33
  • 5
    @cat ikr! & Л; 3python & л; 3 – Zanna 27 September 2016 в 15:43

Perl имеет отличный x оператор:

$ perl -e 'print "foo\n" x 5'
foo
foo
foo
foo
foo

Итак, в качестве простого решения вы можете просто написать свою строку несколько миллионов раз. Например, эта команда создала файл 3G:

perl -e 'print "This is my line\n" x 200000000' > file

Если вам нужно указать точный размер (в этом случае 2 гигабайта), вы можете сделать:

perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file
9
ответ дан 23 May 2018 в 05:43
  • 1
    Если вы терпеливы, вы можете использовать классные операторы Perl 6, за исключением того, что Perl 6 намного, намного, намного, намного медленнее: D – cat 27 September 2016 в 15:42
  • 2
    @cat это действительно? Я вообще не коснулся 6, но я предположил, что у него будет только одна доброжелательность плюс дополнительные возможности OO. Любая идея, почему это медленнее? – terdon♦ 27 September 2016 в 15:56
  • 3
    Мой комментарий был в основном glib, но я нашел в начале этого года, что Perl 6 довольно медленный, по сравнению с Python 3, который канонически намного медленнее, чем Perl 5 (который я не тестировал). Работа сосредоточена на функциях и правильности, а не на производительности, но она была указана как цель на 2015 год. Кроме того, Является ли Perl 6 достаточно быстрым для меня? . – cat 27 September 2016 в 16:07
  • 4
    (С другой стороны, список функций впечатляет , если не сказать больше.) – cat 27 September 2016 в 16:09
Поместите набор слов, которые нужно повторить в файле, например. [F3]. Получите размер source.txt в байтах, например. по:
 stat -c '%s' source.txt
Определить размер целевого файла, например. destination.txt, 2 ГБ или 4 ГБ или что-то еще. Преобразование размера в байтах. Разделите размер файла назначения по размеру исходного файла. bash не может выполнять арифметику с плавающей запятой, но в этом случае она не нужна. Используйте конструкцию for, чтобы повторить операцию cat source.txt с моментами деления. Это будет ближайший приблизительный размер файла назначения, который вы можете получить путем повторения. Выход операции сохраняется в destination.txt.

Например, если source.txt имеет 30 байт, и мы хотим создать файл размером 2 ГБ, нам нужно:

for ((i=0; i<=((16777216/30)); i++)); do cat source.txt; done >destination.txt

Здесь я устанавливаю верхний предел на ((16777216/30)) во время инициализации; вы можете получить результат и поместить его здесь.

Операция займет некоторое время; чем больше значение source.txt, тем меньше времени потребуется.

7
ответ дан 23 May 2018 в 05:43
  • 1
    Разве это не открывать и закрывать destination.txt один раз для каждой итерации цикла? – hexafraction 27 September 2016 в 18:02
  • 2
    @hexafraction Duh, исправлено. – heemayl 27 September 2016 в 18:07

Вы также можете использовать while -loop.

Пример: Содержимое foo.txt (это ваш источник):

foo
bar
foobar

bar.txt пуст (Это ваш целевой файл). Вы можете теперь rn следующего цикла, чтобы записать содержимое foo.txt несколько раз в bar.txt:

while [ $(stat --format "%s" bar.txt) -lt 150 ] 
do 
    cat foo.txt >> bar.txt
done

Объяснение:

stat --format "%s" bar.txt отображает размер bar.txt ] в байтах. while [ $(stat --format "%s" bar.txt) -lt 150 ] следующие действия будут повторяться до достижения целевого размера (в данном случае 150 байт). cat foo.txt >> bar.txt добавьте содержимое foo.txt в bar.txt
6
ответ дан 23 May 2018 в 05:43

сначала из команды fire:

dd if=/dev/urandom of=file.txt bs=2048 count=10

создаст файл на пути к размеру bs * count случайных байтов, в нашем случае 2048 * 10 = 20Kb. который может быть изменен в соответствии с требованием.

cat - > file.txt

Эти команды перенаправляют STDIN в файл, поэтому вам нужно будет ввести две строки, а затем нажать Ctrl + D. Затем вам нужно будет выполнить следующую команду:

for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

Где n - целое число. Это создаст файл с 2 ^ (n + 1) строками в нем, дублируя исходные две строки. Итак, чтобы создать файл с 16 строками, вы бы сделали:

for i in {1..3}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

Вот еще несколько номеров, которые вы начали:

n=15 will give you 65536 lines (if the original two lines were 'hello' and 'world' the file will be 384Kb)
n=20 will give you 2097152 lines (12Mb file with 'hello' and 'world' as the two starting lines)
n=25 will give you 67108864 lines (384Mb file with 'hello' and 'world' as the two starting lines)
4
ответ дан 23 May 2018 в 05:43
  • 1
    OP хочет иметь дело с байтами, а не с линиями. – heemayl 27 September 2016 в 12:22
  • 2
    OP также поддерживает линию копирования для заполнения файла. и моя первая команда уже создала файл в соответствии с необходимыми байтами памяти. – Avani badheka 27 September 2016 в 12:53
  • 3
    @heemayl символ новой строки по-прежнему занимает байт, как и мой предыдущий комментарий. Это законный характер. Тем не менее, ОП задал слова , Авани, поэтому я не думаю, что ваш метод / dev / urandom отвечает на их вопрос. – Mike S 29 September 2016 в 00:41
  • 4
    Это зависит от / dev / urandom, независимо от того, используете ли вы какие-то случайные байты. Даже вы можете выбрать свои собственные файлы, содержащие столько байтов данных. – Avani badheka 29 September 2016 в 08:24

FIFO - это, вероятно, то, что вы ищете. Вместо того, чтобы вызывать вашу программу с данным файлом, вы можете связать с ней результат команды оболочки с помощью подзадачи процесса, и программа увидит его вывод как файл открытого текста. Преимущество здесь в том, что вы больше не ограничены дисковым пространством, поэтому вы можете достигнуть файлов, которые были бы невозможны в противном случае, если вашей программе не нужно сначала буферизовать весь файл и просто анализировать ее по строкам. Например, используя ответ @hobbs для генерации контента:

wc -c <(yes we have no bananas | head -n 5000000000)

Это дает мне 95-гигабайтный файл (в соответствии с wc) без каких-либо затрат на место на жестком диске и практически без ОЗУ, команда возвращается до того, как будет прочитана. Это примерно так же близко к «бесконечно», как вы собираетесь получить.

3
ответ дан 23 May 2018 в 05:43

Другие вопросы по тегам:

Похожие вопросы: