1

ファイルを小さなチャンクでアップロードする WSSv3 アプリケーションを作成しました。すべてのデータが到着したら、パフォーマンス上の理由から一時的に SQL 2005 のイメージ データ型フィールドに保持します**。

アップロードが終了すると問題が発生します。WSSv3 オブジェクト モデルを使用して、SQL Server から SharePoint ドキュメント ライブラリにデータを移動する必要があります。

現在、次の 2 つのアプローチが考えられます。

SPFileCollection.Add(string, (byte[])reader[0]); // OutOfMemoryException

SPFile file = folder.Files.Add("filename", new byte[]{ });
using(Stream stream = file.OpenBinaryStream())
{
    // ... init vars and stuff ...
    while ((bytes = reader.GetBytes(0, offset, buffer, 0, BUFFER_SIZE)) > 0)
    {
        stream.Write(buffer, 0, (int)bytes); // Timeout issues
    }
    file.SaveBinary(stream);
}

このタスクを正常に完了する他の方法はありますか?

** パフォーマンス上の理由: すべてのチャンクを SharePoint に直接書き込もうとすると、ファイルが大きくなる (>100Mb) につれてパフォーマンスが低下することに気付くでしょう。

4

3 に答える 3

1

次のコードで終了しました:


myFolder.Files.Add("filename", 
   new DataRecordStream(dataReader, 
      dataReader.GetOrdinal("Content"), length));

ここで DataRecordStream の実装を見つけることができます。DbDataRecord基本的には、スルーからデータを読み取るストリームです.GetBytes

このアプローチは に似てOpenBinaryStream()/SaveBinary(stream)いますが、データの転送中にすべての byte[] をメモリに保持するわけではありません。ある時点で、64k チャンクを使用してDataRecordStreamアクセスします。Microsoft.SharePoint.SPFile.CloneStreamToSPFileStream

皆様、貴重な情報ありがとうございます!

于 2009-09-30T13:31:46.453 に答える
0

前述のように、Sharepoint に大きなファイルを保存することは、一般的にはお勧めできません。詳細については、次の記事を参照してください: http://blogs.msdn.com/joelo/archive/2007/11/08/what-not-to-store-in-sharepoint.aspx

そうは言っても、BLOB に外部ストレージを使用することは可能です。これは、パフォーマンスの問題を解決する場合としない場合があります。Microsoft は、このトリックを実行する半分完全な外部 BLOB ストレージ プロバイダーをリリースしましたが、残念ながらファーム レベルで機能し、影響を与えます。すべてのアップロード。イク。

幸いなことに、独自の外部 BLOB プロバイダーを実装できるため、これらの特定のファイルをより適切に処理するために何かを作成できる場合があります。詳細については、次の記事を参照してください: http://207.46.16.252/en-us/magazine/2009.06.insidesharepoint.aspx

これがオーバーヘッドに値するかどうかは、問題の程度によって異なります。:)

于 2009-09-29T15:29:08.997 に答える
0

最初に言っておきたいのは、SharePoint は実際には、このように設計されていないということです。すべてのファイルを独自のデータベースに保存するため、これらの大きなファイルはそこに保存されます。これは、スケーラビリティ、コスト、バックアップ/復元、パフォーマンスなど、さまざまな理由からお勧めできません。そのため、代わりにファイル共有を使用することを強くお勧めします。

web.config の httpRuntime 要素の executionTimeout 属性を変更することで、Web 要求のタイムアウトを増やすことができます。

それとは別に、他に何を提案すればよいかわかりません。こんなに大きなファイルが SharePoint に保存されているとは聞いたことがありません。絶対にこれを行う必要がある場合は、Server Faultについても質問してみてください。

于 2009-09-29T09:19:28.700 に答える