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

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

4回答

905閲覧

ファイル解凍 処理の分割方法は可能か

anjyu

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2020/04/26 09:04

前提・実現したいこと

bashかpythonで、xz,gz,bz2形式のファイルを解凍するプログラムを書きたい。
今はひとまずbashで考えている。

ファイルはcsvを圧縮したもので、一つの圧縮ファイルに一つのcsvファイルが入っている。csvには日本語も入っている。
圧縮するのは別の人なので、先に分割して圧縮はできない。

発生している問題・エラーメッセージ

圧縮ファイルが大きすぎる場合、サーバのリソース(メモリ&CPU)を使い切ってしまい、他プロセスに迷惑をかけるため、処理を分割するとか、一度に処理する量をへらす等を検討しているが、よい方法がなく困っている。
なお、バッチ処理なので、時間がかかるのは問題ない。

プログラムで解決できる問題ではなく、Linux寄りで検討すべきなのかもしれないとは考えている。実行ユーザを他プロセスと変えて、そのユーザの使えるリソースを制限するとか?しかし、どのサーバでも動かせるプログラムにしたいので、できればそのような方法は回避したい。

該当のソースコード

bash

1gunzip -c "$compressed_file" > "${decompress_full_path}" ;

試したこと

圧縮ファイルをsplitして、それぞれ解凍できないかと思ったが、破損のエラーで解凍できなかった。

補足情報(FW/ツールのバージョンなど)

CentOS 7
Bash 5.0.17
python 3.6.10

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

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

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

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

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

coco_bauer

2020/04/26 23:55

「圧縮するのは別の人なので、先に分割して圧縮はできない」というのは、何故ですか? 圧縮ファイルが大きすぎるのが問題なら、圧縮する前のファイルを分割する等して小さくするしかないと思います。 何か質問に書かれていない事情があるなら、質問に追加して下さい。 具体的に何をしたいのかを質問に追加して下さい。
guest

回答4

0

一つの圧縮ファイルに一つのファイルしか入っていないのでは、処理の分割のしようがないように思えます。

圧縮ファイルが大きすぎる場合、サーバのリソース(メモリ&CPU)を使い切ってしまい、他プロセスに迷惑をかけるため、

nice値を設定してファイル展開プロセスの優先度を低くしてやるというのはどうでしょうか。
https://www.ibm.com/developerworks/jp/linux/library/l-lpic1-v3-103-6/index.html

投稿2020/04/26 10:13

KojiDoi

総合スコア13671

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

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

anjyu

2020/04/26 23:34

ありがとうございます。 やはりそちらの方になりますよね。プログラムではなんともならないですね。
guest

0

自己解決

プログラムでの対応は断念しました。
実行ユーザかプロセスレベルで制限します。
クローズします。ありがとうございました。

投稿2020/04/27 00:05

anjyu

総合スコア0

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

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

0

解凍処理をDockerのコンテナにするのはいかがでしょうか。
使用するリソースをコンテナの起動時のオプションで指定できます。
ただ、そのリソースの管理は内部でcgroupを使っているので、結局のところanjyuさんの書かれている実行ユーザのリソースを制限するというのを内部で行っていると思うのですが、少なくともその部分を自分で組まなくて良くなるというメリットがあると思いました。

投稿2020/04/26 16:12

akainem

総合スコア40

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

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

akainem

2020/04/26 16:16 編集

これだと、解凍処理が必要とするメモリが、使用できるメモリを上回る場合に処理できなくなってしまうだけかもしれないですね、、思いつきですみません。
anjyu

2020/04/26 23:35

ありがとうございます。 そうなんですよね。無理ですよね。 プログラムでは無理だと皆さんの意見をきけただけでも貴重でした。
guest

0

何をしたいのかよく分かりません。どっちかだと思いますが。

1.伸長したファイルを複数個に分割したい

sh

1gunzip -c "$compressed_file" | split -l 10000

カレントディレクトリに、10000行毎に分割されたファイル群が出来ます。

2.伸長したファイルの一部を取り出したい

sh

1gunzip -c "$compressed_file" | sed -n 10001,20000p > file-10001-20000

10001行目から20000行目までだけ取り出します。

投稿2020/04/26 09:14

otn

総合スコア84555

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

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

anjyu

2020/04/26 23:33

ありがとうございます。1はやりたいことと異なります。解凍時にメモリやCPUを専有するのを防ぎたいため。2もおそらく一度全部メモリに展開してしまうので、違うようです。 プログラムではどうにもならない気がしてきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問