- PR -

シェル内で変数宣言したときのメモリの消費について

1
投稿者投稿内容
だま
会議室デビュー日: 2004/08/28
投稿数: 19
投稿日時: 2004-10-29 17:36
現在作っているシェルの中で、複数行あるテキストファイルを上から1行ずつ読み込み、
各行の内容をそれぞれ別の変数に代入させる処理をさせようとしています。
この時のメモリ消費の考え方なのですが、単純に100KBあるテキストファイルを
読み込めば100KB消費し、30MBあれば30MB消費するだけ、と考えてもいいのでしょうか?

また、1枚のテキストファイルの内容を50〜100個ほどの変数に分けて格納するすることに
なると思うのですが、あまり変数の数が多いと不具合が発生したりはしないのでしょうか?

以上2点、どなたかご教示いただければ幸いです。
非武装エリア
大ベテラン
会議室デビュー日: 2004/03/03
投稿数: 202
お住まい・勤務地: 日本・たこ部屋
投稿日時: 2004-10-29 18:26
ご質問の内容をそのまま素直に受け取るなら、シェルでやるべき処理では無いように考えられます。シェルでの処理は文字ストリームや、単純な処理制御には適していますが、ファイルを扱った処理には余り適していないと思います。

やりたい事をもう少し詳しく記述して頂ければ、適した処理系への案が出てくると思いますが如何でしょ?
(何となくAWKやPerlを使った方が簡単なことのような予感がします)

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-10-29 23:16
第5回 シェルの変数に慣れる
http://www.atmarkit.co.jp/flinux/rensai/shell05/parameter.html
テストを作って実行するとわかります+メモリ使用量を見るコマンド
たぶん配列変数(shには無い?)

しかし、シェルはプログラム言語としは、読みにくいので
普通の言語(スクリプト)を使ってほしいものです(長い場合は)

[ メッセージ編集済み 編集者: MMX 編集日時 2004-10-29 23:20 ]
だま
会議室デビュー日: 2004/08/28
投稿数: 19
投稿日時: 2004-10-30 00:36
ご回答ありがとうございます。

そうですよねえ、シェルでちまちまやることではないとは思うんですが、
今回会社のサーバでして、テキスト(シェルスクリプト)しかリリースしては
いけないルールになってるんです(泣)。

刻々と増加する50個ほどのデータ項目があり、各項目の数値に変化があった場合、
「○番目のデータがアップしました!」とメッセージを出力させる処理を行いたいと
思っています。
なんの工夫もなく50個のデータをいったんそれぞれの変数に退避させておき、
例えば30秒後に再度全データを取得したうえで50個それぞれを比べ、変化の有無を
確認しようとしてます。
そうなると初回取得用の変数が50個、2回目取得用の変数が50個で、単純計算でも
100個変数を使うことになってしまいそうなのです。

なんかもうちょっとセンスのよい書き方はありますか?
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-10-30 01:54
「テキスト」という条件であれば、awk でも perl でもよいと思うですが...
それはさておき。

引用:

だまさんの書き込み (2004-10-29 17:36) より:
この時のメモリ消費の考え方なのですが、単純に100KBあるテキストファイルを
読み込めば100KB消費し、30MBあれば30MB消費するだけ、と考えてもいいのでしょうか?



そうはならないと思います。シェルの実装しだいですが。
たとえば、malloc(3)を用いてメモリを確保するようにしているとして。
必要なサイズにぴったりあわせたメモリを要求するようにしているか
どうかは?ですし(そういう設計だと、変数のサイズが大きくなった
場合には確保をやり直さなくてはならない)。malloc(3)がsbrk(2)を
用いて実装されているとして、必要な量にぴったりあわせて sbrk を
発行しているというのは考えにくい(メモリを要求されるたびに
システムコールを発行していたのではオーバーヘッドが大きい)ですし。

あと、そもそも30MBも扱えるかどうか、というところも?ですので
調べておいたほうがよいと思うです。

変数の個数は...
シェルの実装に詳しくないと答えられないことで、私はその条件を
満たしていないのですが
50や100ならだいじょうぶじゃないかなあ、と思うです。
気になるならテストしてみるのが吉でしょう。
1

スキルアップ/キャリアアップ(JOB@IT)