質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Q&A

解決済

4回答

2252閲覧

2147483647文字のテキストファイルを作成するコマンドを高速化させたい。

Kchan_01

総合スコア110

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

0グッド

1クリップ

投稿2021/03/31 05:33

編集2021/03/31 05:40

シェルスクリプトで2147483647文字のテキストファイルを作成する手っ取り早い方法は無いでしょうか。

C言語を勉強している初心者です。テストケースに使用するため、2147483647文字のテキストファイルが必要です。

以下のシェルスクリプトを実行して作成しようとしましたが、実行時間がかなりかかってしまって、なかなか終わりません。

for i in {0..2147483647}; do; echo -n a; done; > test.txt

もっと手っ取り早く作成する方法はないでしょうか。
中の文字列は英数字でしたらなんでも問題ありません。

環境はmacです。

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

yes 単体で改行なしは無理っぽいので、base64 にしてみました。手元の環境では5秒くらいでした。もし --wrap を受け付けないなら coreutils の base64 など入れてみてください。

yes a | base64 --wrap=0 | head -c 2147483647 > out

投稿2021/03/31 07:20

68user

総合スコア2022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

printf %2147483647s y > temp.txt

シンプルです。

投稿2021/04/05 23:25

HirohisaKawase

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HirohisaKawase

2021/04/05 23:38

編集が効かないためコメントで訂正します。上記ではyの後が空白になります。 もし、y(もしくは特定の文字)で埋め尽くしたいなら printf %2147483647s |tr " " "y" > temp.txt 空白でもよいのであれば printf %2147483647s > temp.txt
guest

0

私の環境では2147483647回のループでシェルスクリプトを実行しようとするとメモリアロケーションエラーが出てクラッシュしてしまったので、1000000に減らして実行し、さらにperlとawkで同じことをやってみました。

↓思い切りヤラカシていたので修正しました。結論は変わりません。

$ time ( for i in {0..1000000}; do echo -n a ; done;) >/dev/null real 0m5.205s user 0m4.810s sys 0m0.390s $ time awk 'BEGIN{for(i=0;i<=100000;i++){printf "a",i}}' >/dev/null real 0m0.025s user 0m0.023s sys 0m0.002s $ time perl -e 'for(0..1000000){print "a"} ' >/dev/null real 0m0.080s user 0m0.078s sys 0m0.003s

どうやらawkが良さそうです。

投稿2021/03/31 08:50

編集2021/03/31 10:58
KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikapy

2021/03/31 09:03

awkについては、「awk 'BEGIN{for(i=1000000;i>0;i--){printf "a"}}'」ですよね。他は検証してません。 こんなに速いわけないとおもいました。
maisumakun

2021/03/31 09:06

このawkコードだと、1回もループせずに抜けてしまっていますね。
KojiDoi

2021/03/31 11:00

失礼しました。コピペの際に全然関係ないところをコピーしてしまったというミスでした。修正しましたが、結論は変わりません。
ikapy

2021/03/31 11:27

修正どうもです。 yesとawkの結果だけ載せておきます。2147483647はかったるいので100000000(100m)で実行しました。cygwinです。 $ time awk 'BEGIN{for(i=0;i<100000000;i++){printf "a"}}' > out_100m_awk real 0m17.810s user 0m17.750s sys 0m0.062s $ time yes a | base64 --wrap=0 | head -c 100000000 > out_100m_yes real 0m0.362s user 0m0.124s sys 0m0.748s
KojiDoi

2021/03/31 11:52

cygwinは何をやっても随分遅いとは思っていましたが、awkがここまで他と顕著な差がつくとは意外でした。 私が検証に使ったのは、さくらのレンサバ(CentOS 6.1)上のGnu Awk 3.1.4です。 ちなみにbase64を同じループ回数で試してみたら、こうなりました。 $ time yes a | base64 --wrap=0 | head -c 1000000 >/dev/null real 0m0.013s user 0m0.010s sys 0m0.007s 確かにawkに勝っています。しかし、base64というツールの仕様がよく理解できてないんだけど、これ、出力の内容、文字数が他と違いますよね。
ikapy

2021/03/31 11:59

base64は、表示不可文字を表示させる仕組み(一種の暗号化?)ですからね。 文字を増やすためにbase64はよいアイデアだと思いました。
guest

0

ちょっと良いものがみつからなかったのですが参考に以下をあげておきます。

https://unix.stackexchange.com/a/269184
https://unix.stackexchange.com/a/101334

※yesが良さそうですが改行は不要ですよね

投稿2021/03/31 06:06

yamap55

総合スコア1376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問