2017-08-10 7 views
1

私たちは中心のRavenDbで数多くの停止を経験した後、特定のオブジェクトをAzure BLOBストレージにキャッシュしようとしています。レディスはABSと同じSLA保証を持っていないため、レディスは除外されています。Azure BLOBストレージからオブジェクトを逆シリアル化する最速の方法は?

これらのオブジェクトの取得とデシリアライゼーションは毎分発生し、非常に迅速に行われる必要があります。

ここでは、デシリアライズに使用しようとしているコードを示しますが、Ravenからオブジェクトを取得するのに比べて5〜6倍遅くなっています。とにかくそれを最適化するには?オブジェクトのサイズは約8メガバイト

var blob = container.GetBlockBlobReference(entityId + ".json"); 

var serializer = new JsonSerializer 
{ 
    ObjectCreationHandling = ObjectCreationHandling.Reuse, 
    NullValueHandling = NullValueHandling.Include, 
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
    PreserveReferencesHandling = PreserveReferencesHandling.All, 
    TypeNameAssemblyFormat = FormatterAssemblyStyle.Full, 
    TypeNameHandling = TypeNameHandling.All 
}; 

using (var stream = new MemoryStream()) 
{ 
    blob.DownloadToStream(stream); 
    stream.Position = 0; 

    using (var sr = new StreamReader(stream)) 
    using (var jsonTextReader = new JsonTextReader(sr)) 
    { 
     var accountOut = serializer.Deserialize<Account>(jsonTextReader); 
    } 
} 
+0

5-6倍速のものは何ですか?それはデシリアライゼーションのものですか?もしそうなら、あなたはRavenでどのようにデシリアライズしていましたか? (私はそれが何であるかわからない)それは 'GetBlockBlobReference'ですか?もしそうなら、あなたはABSで何もできないのではないかと恐れています。 Azure SQLデータベースを切り替える可能性がありますか? – fharreau

+0

最速の方法は、バイナリデータをBinaryFormatterで保存して読み取るか、自分で行うことです。 – user743414

+0

@fharreau私は5-6xの違いを引き起こしているのか分かりませんが、それはシリアライゼーションに関するものと仮定しています。しかし、RavenDbはそのオブジェクトを内部的にJSONとして保存しています。 GetBlockBlobReferenceはAzureを呼び出しません。単にメモリ内オブジェクトを作成します – Igorek

答えて

0

ループの各サイクルで再作成せずに、単一のシリアライザオブジェクトを使用すると、問題の修正が行われたことが判明しました。一度JsonSerializerオブジェクトをキャッシュして再利用すると、BlobストレージからのデシリアライズのパフォーマンスはRavenDbの50%になりました

+0

考えます - シリアル化では、メモリコストも考慮する必要があります。非常に頻繁にシリアライズすると、より多くのGCサイクルが発生します – Michael

0

はスピードをしたいとのRedis(何らかの理由で)使用することはできませんでしょうか?正しい答えはCosmosDBです。

これは非常に高速で、SSDストレージによってサポートされています。 99.99%の空き領域が1つのリージョン内にあります(Portal UIをクリックするだけで、必要に応じてジオレプリケーションを実現できます)。

+0

CosmosDbのオブジェクトあたり2MBの制限がありますか? – Igorek

+0

はい、そうです - https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-resources#documentsこれらのJSONを意味的に分割できますか?愚かな提案、私は知っている。なぜあなたはレディスを落としたのですか?プレミアム層にはマスター/スレーブノードと永続性(RDB)があります。 – evilSnobu

関連する問題