7

まだリリースされていないDelphi2010アプリケーションを使用すると、ユーザーは自分のファイルをサーバーにアップロードできます。現在、HTTPS POSTを使用してファイルを送信していますが、(簡略化された)アルゴリズムは基本的に次のとおりです。

  1. ファイルを「スライス」に分割(各256KB)
  2. スライスごとに、サーバーにPOSTします

すなわち。1MBファイルの場合:

--> Get Slice #1 (256KB)
--> Upload Slice #1 using TidHTTP.Post()

--> Get Slice #2 (256KB)
--> Upload Slice #2 using TidHTTP.Post()

--> Get Slice #3 (256KB)
--> Upload Slice #3 using TidHTTP.Post()

--> Get Slice #4 (256KB)
--> Upload Slice #4 using TidHTTP.Post()

私はIndy10を使用してます。私はプロファイラーを何度も(ab)使用しましたが、アップロードルーチン自体を変更する以外に、最適化する余地はほとんどありません。

私もマルチスレッドを使用しており、コードを最適化するために最善を尽くしましたが、ベンチマークはそれでももっとうまくできると言っています(はるかに良いタイミングを達成する他のよく最適化されたソフトウェアがあります...ほぼ2倍私のアップロードルーチンと同じくらい速いです!)

私はそれが私のサーバーのせいではないことを知っています...これが私がまだ探求する必要があるアイデアです:

  1. スライスを1つのPOSTでグループ化しようとしましたが、当然これによりパフォーマンスが向上しました(20〜35%)が、再開機能が低下しました。

  2. SFTP / SSHの使用も考えましたが、高速かどうかはわかりません。

  3. Webソケットを使用して再開可能なアップロードを実装します(このコンポーネントのように)。速度についてもわかりません。

今私の質問は:アップロードをスピードアップするために私ができることはありますか?次の条件を満たせば、コマンドラインツール(ライセンスでアプリケーションと一緒に出荷できる場合)を含め、実装できる提案を受け入れることができます

  1. 再開可能なアップロードがサポートされています
  2. 速い!
  3. 合理的なメモリ使用量
  4. ログイン/ユーザー認証を保護して許可する

また、セキュリティ上の大きな懸念から、FTPは私が実装したいものではありません。

どうもありがとう!

4

1 に答える 1

5

TIdHTTP.Post()ファイルをまったくチャンクせずに、ファイル全体に対して単一の処理を行うことをお勧めします。イベントを使用TIdHTTP.OnWork...してサーバーに送信されたバイト数を追跡​​できるため、必要に応じてどこから再開すればよいかがわかります。再開するとき、このプロパティを使用してTIdHTTP.Request.CustomHeaders、どこから再開するかをサーバーに伝えるカスタム ヘッダーを含めることができます。これにより、新しいデータを受け入れる前に、以前のファイルを指定されたオフセットにロールバックできます。

于 2012-02-29T01:00:14.647 に答える