C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: BinaryFormatterを使ったデシリアライズの高速化


(過去ログ 119 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■69876 / inTopicNo.1)  BinaryFormatterを使ったデシリアライズの高速化
  
□投稿者/ あしゅ (1回)-(2014/02/05(Wed) 04:37:47)

分類:[.NET 全般] 

現在以下のようなデータをシリアライズして一つのファイルとして保存しています。
(System.Runtime.Serialization.Formatters.Binary.BinaryFormatterを利用)
ファイルが大量にあるための一覧を表示するプログラムを作成していました。

[Serializable]
public class MyClass
{
public string titile;
public byte[] data;
}

dataのサイズが大きいためtitleの部分だけ取得し一覧を作成、クリックしたら全データを作成しようと考えました。
SerializationBinderを利用して実装してみたのですが(titleだけを所持したクラスを作成して流し込んでみた)
結果としては逆に遅くなってしまいました。

一度シリアライズしたデータから目的の部分だけ抜き出すことで高速化するという実装には無理があるのでしょうか?
詳しい方のご意見を頂けると嬉しいです。
引用返信 編集キー/
■69877 / inTopicNo.2)  Re[1]: BinaryFormatterを使ったデシリアライズの高速化
□投稿者/ yo (1回)-(2014/02/05(Wed) 05:49:24)
yo さんの Web サイト
No69876 (あしゅ さん) に返信
> 現在以下のようなデータをシリアライズして一つのファイルとして保存しています。
> (System.Runtime.Serialization.Formatters.Binary.BinaryFormatterを利用)
> ファイルが大量にあるための一覧を表示するプログラムを作成していました。
>
> [Serializable]
> public class MyClass
> {
> public string titile;
> public byte[] data;
> }
>
> dataのサイズが大きいためtitleの部分だけ取得し一覧を作成、クリックしたら全データを作成しようと考えました。
> SerializationBinderを利用して実装してみたのですが(titleだけを所持したクラスを作成して流し込んでみた)
> 結果としては逆に遅くなってしまいました。
>
> 一度シリアライズしたデータから目的の部分だけ抜き出すことで高速化するという実装には無理があるのでしょうか?
> 詳しい方のご意見を頂けると嬉しいです。

情報ありがとうございます。
引用返信 編集キー/
■69899 / inTopicNo.3)  Re[2]: BinaryFormatterを使ったデシリアライズの高速化
□投稿者/ あしゅ (2回)-(2014/02/07(Fri) 17:36:20)
質問したらお礼されるというよく分からない状況です。
引用返信 編集キー/
■69959 / inTopicNo.4)  Re[1]: BinaryFormatterを使ったデシリアライズの高速化
□投稿者/ shu (491回)-(2014/02/13(Thu) 12:53:36)
No69876 (あしゅ さん) に返信

ファイル名に自由度があれば
ファイル名のそのTitleの内容を含めてしまうという方法も
ありかと思います。

ファイル名に自由度がなければ
別にインデックス用ファイルとしてTitleとファイル名を対応付けする内容を
持ったファイルを作成しておくということで改善される可能性があります。
このファイルの内容は可能であれば固定長で情報をもつようにして1つ1つの情報に
アクセスするのに固定位置を指定できる構造にしておくとなお良いと思います。


引用返信 編集キー/
■70170 / inTopicNo.5)  Re[2]: BinaryFormatterを使ったデシリアライズの高速化
□投稿者/ tocs (12回)-(2014/02/26(Wed) 21:58:47)
tocs さんの Web サイト
> ■No69876 (あしゅ さん) に返信

私も大量のデータファイルから検索処理を高速化させたことがありますが、
高速化の鉄則はボトルネックの評価ですので、まずStopWatchで各部の処理時間を計測する必要があると思います。
私の場合データがFileServerにあることで通信による速度低下も原因ではあったのですが、
ファイルオープン・クローズがその約10倍遅いボトルネックでした。

shuさんが記載されている
> 別にインデックス用ファイルとしてTitleとファイル名を対応付けする内容を
> 持ったファイルを作成しておくということで改善される可能性があります。

はその通りで、ファイルオープンせずに得られる[ファイル更新日時], [ファイル名], [ファイルサイズ]および検索対象のデータの
コレクションを1つのファイル(=インデックスファイル)として保存し、検索時には更新日時などが変化されていなければ
ファイル内の検索対象データを使うというものです。考え方はただのキャッシュです。

http://jeanne.wankuma.com/tips/csharp/file/gettimestamp.html

難しい実装にもならないのでボトルネックがオープンクローズにあるならおすすめの方法です。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -