2011-12-05 6 views
1

protobufライブラリを使用して、高価なクエリの永続的なグローバルキャッシングを開始しました。私はそれをMSSQLのテキストフィールドとMSAccessのメモフィールドに格納しているので、次にSqliteに拡張する予定です。そうでなければバイナリフィールドを使用することを嫌っています。私は文字列操作をよりよくクロスdbバイナリよりも。 ToBase64Stringの手順は、protobuf(サイズ、速度、メモリ使用量)のさまざまな利点を取り消すようです。protobuf-netストリームをbase64に変換すると、protobufのperfとsizeの利点が失われますか?

public void StoreInDb(T dataPoints, string parameters, string queryName) 
{ 
    //Store in cache 
    MemoryStream stream = new MemoryStream(); 
    Serializer.Serialize(stream, dataPoints); 
    byte[] data = new byte[stream.Length]; 
    stream.Seek(0, SeekOrigin.Begin); 
    stream.Read(data, 0, data.Length); 
    string output = Convert.ToBase64String(data); //Meh, not pretty 
    using (CacheInsert inserter = new CacheInsert()) 
    { 
     inserter.Insert(parameters, output, DateTime.Now.AddDays(1), queryName); 
    } 

} 

これをより速く安価に行う方法についてのご意見はありますか?

+0

もう1つの重要な質問は、おそらく、「比較した...」ですか? –

答えて

3

あなたが使用して、データの重複を避けることができます。

string base64 = Convert.ToBase64String(
     stream.GetBuffer(), 0, (int)stream.Length); 

ベース-64は少しオーバーヘッドが追加されますが、通常は問題ないはずです。あなたの文字列のデータ型がUTF-16の場合は、もちろんサイズを倍にすることに注意してください。

1

バイナリ形式でデータを格納しようとしましたが、バイナリデータ型が許可されていない文字列として格納することに失敗しました(実際にあれば)。ただし、ベース64文字列に変換する必要がある場合は、protobufのすべての利点を元に戻すことはありません。元の生データをbase64に変換した場合よりも結果が圧縮されます。

関連する問題