- 締切済み
テンプレートを使ったファイル生成
1.1000人分のデータ(テキスト形式だがDBに入れることも可能)がある 2.出力用フォーマット(テキスト形式で200種類)がある 3.[2]のフォーマットに[1]のデータ(1人分)をセットして、テキストファイルを出力する。 結果、1000人分×200種類のテキストファイルが生成される。 4.作成されたファイルをFTPでアップロードする。 というバッチを作りたいのですが、言語としては何がベストなのでしょうか。 環境はWindowsServer2003です。 現状のシステムではとても時間が掛かっており、仕様変更に伴いゼロから作り直すことになりました。 現状使用しているシステムは、当時は画面でキックする必要があったらしく、perlで作られていますが、現在は画面からキックする必要性がないため、改修後はバッチ実行を考えています。 また、[4]については、ZIPに圧縮したファイルをアップロードし、サーバ側で解凍しようと思っています。 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- akaginoyama
- ベストアンサー率43% (37/86)
#5です。 書き忘れたので追記します。 処理をより早くするには、なでしこ側からLUAでループ処理を書くとかなり早くなります。
- akaginoyama
- ベストアンサー率43% (37/86)
記述するソースコード量や処理の得意分野では圧倒的に"なでしこ" が有利かと思います。 200種類の詳しい処理の分岐は解りませんが、場合によっては 数十行から数百行のコードで書けるかもしれません。 件数からしてもDBを噛ませれば処理スピードも気にならない程度だと 思います。
- 参考URL:
- http://nadesi.com/
お礼
アドバイスありがとうございます。 「なでしこ」というものは全く知りませんでした。。 URLまでご提示いただいてありがとうございます。 調べてみたいと思います。
- tatsu99
- ベストアンサー率52% (391/751)
#3です。 >2.こちらも仰る通り、200,000ファイルを転送しています。 >ただ、圧縮する場合も、多数のファイルをひとつひとつ転送する場合も、「最初に通信を開始する」という動作は変わらないと思うのですが、そういうことではないのでしょうか? たしかに、その通りですが、200,000のファイルの転送の場合は、1ファイル毎に、(1)通信の開始、(2)ファイル転送、(3)通信の終了を繰り返します。 私が言いたかったのは、ここで、通信の開始に要する時間(実際は(2)ファイル転送以外の時間)が無視できないほど、時間がかかっているということです。その為、この時間が200,000回繰り返されると、この時間は非常に、大きな時間になります。 もし、圧縮して1ファイルになるなら、「通信の開始」に要する時間は1回限りですので、非常にロスが小さくなります。 もし、1つ1つのファイルを個々に圧縮して、200,000個のファイルを送るなら、それほどの時間短縮は期待できないはずです。今回で重要なのは、転送するファイルの個数をいかに少なくするかです。
お礼
お礼が遅くなりすみません。 「最初に通信を開始する」ということが、コネクトすることだと思っておりました。 ですので、ファイルの個数に関係なく、コネクトは1回限りだから変わらないのでは?と思ってしまいました。 ご指摘の点は問題ありません! 全ファイルをまとめて一つのzipに圧縮しますので、ファイルの個数は1つとなります。 アドバイスありがとうございました!
- tatsu99
- ベストアンサー率52% (391/751)
いくつか、気になる点がありましたので、コメントさせてください。 1.現在は (1)ファイルを圧縮する。 (2)ファイルを解凍する。 (3)ファイルをFTPで送る。 ということを、やっているように見えますが、それなら、ファイルの圧縮、解凍をせずにそのまま、送るのも、1つの方法かと思います。 但し、今後は、圧縮した状態のものを、送るということなので、FTPの転送に時間がかかっている場合は、圧縮したものを送る方が、効率がよいでしょう。 2.1000人分×200種類のテキストファイルが存在するということは、 200,000個のファイルをFTPで転送しているのでしょうか? 私が、以前、FTPによるファイル転送の業務を開発したときは、(私の経験では)FTPで多数のファイル(但し1ファイルのサイズはあまり大きくない場合)を転送する場合、時間がかかるのは、転送そのものの時間ではなく、最初に通信を開始するときのオーバーヘッドでした。(プログラム的には、connectの部分)従って、多数のファイルをまとめて、1つにする事が出来れば、FTPの転送時間が、かなり改善されるはずです。 3.FTPで転送を行っていますが、もし、送信先のサーバーが社内のものでwindowsによるファイル共有ができるなら、ファイル共有で、送信先のディレクトリに転送する方法をとった方が、速くなるはずです。 4.もし、200,000個のファイルのファイルを1つ1つ転送する方法をとる場合は、ファイルを作るプロセスとファイルを転送するプロセスを別々に作り、作られたファイルを、即座に別のプロセスがFTPで送るようにしておけば、トータルの時間は短縮できます。(現在は、全てのファイルを作ったあとFTPで送信しているように見受けられましたのでコメントしました。)
お礼
アドバイスありがとうございます。 1.仰る通り、現在は、圧縮→解凍→FTPという流れです。 圧縮は、ファイル生成側のシステムで行っていて(生成されたファイルをzip形式で画面からダウンロード)、FTPは別のシステムとなっています。(複数のサーバへアップロードする必要があるため、手動ではなくシステムを利用) ここは、仰る通り、圧縮したものを送り、サーバ側で解凍することで時間短縮がはかれると考えています。 2.こちらも仰る通り、200,000ファイルを転送しています。 ただ、圧縮する場合も、多数のファイルをひとつひとつ転送する場合も、「最初に通信を開始する」という動作は変わらないと思うのですが、そういうことではないのでしょうか? 3.転送先が社外のサーバ(Webサーバ)ですので転送方法としてはFTPしかなさそうです。。 4.1.でも記載したのですが、現状は別々のシステムで行っているので全てのファイル生成後にアップロードする形となっていました。改修後は圧縮して転送する方法をとるので問題ないかと思います。
- tatsu99
- ベストアンサー率52% (391/751)
やはり、#1のかたが言われているように まず、ボトルネックの部分の特定が、最初の作業になるかと思います。 「現状のシステムではとても時間が掛かっており・・」の 時間とは、具体的にどのくらいなのでしょうか。 また、希望する時間は、どの程度なのでしょうか。 本当に短い時間(例えば2~3秒以内)を希望されるなら、最終的には C言語が、候補になるかも知れません。もし、もう少し、時間がかかってよいのなら、(ボトルネックを回避できれば)perlで間に合うかも知れません。
お礼
アドバイスありがとうございます。 説明不足ですみません。 >「現状のシステムではとても時間が掛かっており・・」の >時間とは、具体的にどのくらいなのでしょうか。 現状システムでは[3]のファイルを画面からダウンロード(zip)して、ローカルで解凍し、アップロード用のシステムをキックする形で、 [1]~[3]で20~30分 [3]のzipの解凍で5分 [4]のアップロードが1時間弱(これはサーバ側の問題もあるのである程度仕方ないですが…) となっています。 これを、ファイル生成後zipのままアップロードして、サーバ側で解凍することで、[3][4]の時間短縮は可能だと考えています。 早ければ早い方がいいのですが、数秒とまでは思っていないので、現状のプログラムで最も時間が掛かっている部分を調査してみたいと思います。 そもそも他の言語の方が向いているのであれば、現行システムのプログラムを追うのも時間の無駄になってしまうので先に質問をしてしまいましたが、perlが良いのではないか、とのことなのでボトルネックとなっている部分の調査から始めたいと思います!
- alesi_sato
- ベストアンサー率35% (23/65)
テキストの処理なら、やはりPerlでしょうか。 既存のボトルネック部を見直してスピードアップされては如何でしょうか。
お礼
アドバイスありがとうございます。 単純にファイル生成の比較だけをいくつか簡単に作成できる言語で行うと、 VBS < PHP << VB.Net << perl とperlが最も遅かったので、perlは避けた方がいいのかと思っていました。。 ちなみに150ファイル生成でVBSで0.1秒、Perlで2.1秒でした。 もちろん他の処理も入ってくるので一概にこの部分だけで判断はできませんが…。
お礼
処理のアドバイスまでいただきありがとうございます! 参考にさせていただきます。