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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

4009閲覧

大容量のXMLファイルの保存方法について

takac3tama

総合スコア13

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

3クリップ

投稿2015/11/27 00:17

現在C#にて、解析ツールのGUIの開発を行っております。
解析開始後10秒毎に数KBのXMLファイルを作成・保存して、解析終了後に保存されたXMLファイルをひとつのXMLファイルに結合しようとしています。
但し、この結合処理に時間が掛かり過ぎてしまい、処理方法を再検討中です。
10秒毎のXMLファイル作成はXmlWriterを使用し、結合はLinq to XMLのLoad、Add、Saveを使用しています。
現在の負荷測定では、約1時間で5000個作成されたXMLファイルを結合するのに3分程掛かってしまいます。

おおまかな説明で恐縮ですが、アドバイス宜しくお願いします。

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

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

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

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

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

Tak1wa

2015/11/27 00:53

こんにちは。そもそも現状はLoad, Add, Saveのどこがボトルネックになっているのでしょうか。その辺りの分析はお済みですか?
takac3tama

2015/11/27 01:02

詳細分析まではしておりませんが、多分Loadかと思います。 最初は、10秒毎に結合していましたが、ファイル量が大きくなるにつれ時間が掛かっていました。
guest

回答4

0

ベストアンサー

5000個のXMLファイルを結合する処理で3分というのは相当程度高速と思います。どの位の処理時間にしたいのでしょうか?
ファイルのオープン、クローズに時間がかかりがちですから、バックグラウンドでファイルのオープン、クローズをするようにすると改善できるかもしれません。

投稿2015/11/27 00:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takac3tama

2015/11/27 00:35

本ツールは終日運用することを考慮しなければならず、単純計算で24倍すると結合に72分掛かります。 ユーザー目線で考えると厳しいと思われます。 今考えている方法としては、ある一定のファイル数に到達したら一時保存して最後に一時保存のファイルを結合しようかと考えています。
退会済みユーザー

退会済みユーザー

2015/11/27 00:54

一度に結合すると72分待つのはキツイでしょうね。一定間隔毎にバッチ処理で中間ファイルを作っておくのは懸命でしょう。
trick

2015/11/27 01:25 編集

削除しました。
takac3tama

2015/11/27 01:59

仰るとおり、中間ファイルを作成する方法で再検討します。
guest

0

とにかく高速化したいというのであれば、結合処理はDBMSを介して行うというアイデアはどうでしょうか。
中間データ形式としてDBファイル(accdb/sqlite/sdf(SQL Server Compact)等)を用意し、結合処理ではXmlReaderで読み込んでDBにデータを放り込んでいき、結合ファイルが必要なときはDBから読み込んでXmlWriterで出力、という具合です。

投稿2015/11/27 01:38

catsforepaw

総合スコア5938

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

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

takac3tama

2015/11/27 01:55

回答ありがとうございます。 残念ながら、DBについては勉強不足でして・・・
guest

0

結合後のファイルは、5000ファイル*10KB として約50Mぐらいですかね
50Mぐらいでしたら、全てメモリ上でデータを保持して、最後に保存するのはどうでしょうか?
保存時間が気になるのであれば、バックグラウンドで保存するようにすれば問題ないと思います。

また、どうしても細かいファイルに分けるのであれば、バックグラウンドで少しづつ
結合していけばよいと思います。

投稿2015/11/27 00:50

trick

総合スコア366

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

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

takac3tama

2015/11/27 01:57

回答ありがとうございます。 仰るとおり、少しずつ結合する方法で検討してみます。
guest

0

結合はLinq to XMLのLoad、Add、Save

UNIX/Linuxならcatとリダイレクトで
cat file1 file2 file3 > file0
って使えませんか?
どっちが速いか知りませんが。

投稿2015/11/27 00:47

Orlofsky

総合スコア16415

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

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

退会済みユーザー

退会済みユーザー

2015/11/27 00:50

XMLファイルですから、単純に連結というわけにはいかないような・・・。
Orlofsky

2015/11/27 00:54

解析ツールでファイルの最後にきちんと改行コードを入れたらcatが使えるかと思ったのですが。
takac3tama

2015/11/27 00:55

残念ながら、開発環境がVS C#なので・・・
Orlofsky

2015/11/27 02:12

C#からUNIXコマンド実行 でググるとC#から cat コマンドを実行する方法が見つかるのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問