2016-09-22 10 views
0

このデータからレポートを作成するには、dbから別のレコード(1000.000)を大量に取得する必要があります。私のDBはリモートシステム上にあります。これで、各レポートに異なるSQL文が作成されました。このSQL文は、サービスに送信されます。このサービスはDataSetを埋め込み、これをアプリケーションに返します。これで、DataSetをレポートにバインドできます。 問題は、レコード数のデータセットには膨大なメモリ消費があることです。つまり、データをロードすると、1回のロードでメモリが1GBに上昇します。dbからコードへの大量の未知のデータ

このメモリを消費しないでデータをロードする方法はありますか? 私はすでにNHibernateのようなORMを使用していますが、問題はロードされるデータがわからないということです。変更できるSQLステートメントが異なる数百ものレポートがあるので、マップするクラスを何百も作成できません...

編集:あなたが尋ねるべき

 DataSet dataSet = new DataSet(); 
    try 
    { 
     using (FbConnection connection = new FbConnection(strConnString)) 
     { 
      connection.Open(); 
      using (FbCommand cmd = 
       new FbCommand(
       "SELECT * FROM CUSTOMERS;", 
       connection)) 
      { 
       FbDataAdapter fbd = new FbDataAdapter(cmd); 
       fbd.Fill(dataSet); 
       // This is what the default ADO.Net provider can do.. 
       //SqlCommand command = new SqlCommand(queryString, connection); 
       //System.Xml.XmlReader reader = command.ExecuteXmlReader(); 
      } 
     } 

    } 
    catch (Exception ex) 
    { 

    } 

答えて

0

質問です:それをどのくらいのデータであり、メモリのオーバーヘッドは何ですか

は、ここに私が使用しています私のサンプルコードです。 OVERHEADが大きい場合は、より良いデータ構造を見つける必要があります。 DATA自体が大き過ぎてメモリが使えない場合は、一度にメモリの一部だけをメモリに取り込む方法を検討する必要があります。

どちらの場合でも、NHibernateを使用して大量のレポートを作成することは疑わしいです。既存のマッピングされたクラスを使用してクエリを構築すると便利ですが、単純なマップされていないDTOクラスまたはオブジェクト[ NHibernateがすべての結果に対してマップされたクラスをインスタンス化するのを避けるために、後者はパフォーマンスとメモリ消費の両方にとって悪いでしょう。

ああ、データセットを返すWebサービスがあることを意味しましたか? DataSetクラスはMicrosoft固有のものであり、さまざまな理由で(http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx)一般的に悪いスタイルと見なされます。

+0

ウェブサービスは自分のアプリケーションでのみ使用されます。私はdbからデータをロードする必要があり、DataSetはfirebirdとADO.Netプロバイダを使用している方法でそれを行う唯一の方法でした。 DataSetをXMLやJsonなどに解析すると、パフォーマンス上の問題が発生します。 XMLにデータを直接ロードする可能性があるとすれば、これは良いことだが、これまでに何も見つかりませんでした。データセットにロードしてXMLに書き込む方法があります。 Orginal SQLCommandクラスにはExecuteXmlReader()のようなものがありますが、このFirebirdプロバイダ(FBCommand)のようなものはありません。 – Franki1986

+0

何かがここにあります... ADO.Netの基本的な戻り構造は、DataSetではなく、* DataReader *です。このフレームワークは、DataReaderをDataSetに読み込むための便利なメソッドを提供しますが、これは私の知る限り、ADO.Netのユーザーが明示的に実行する必要があります。 –

+0

私は何かを説明するためにいくつかのコードを書いています。 – Franki1986

関連する問題