Delphi 2010を使用してアップロードルーチンを最適化する方法?
-
13-11-2019 - |
質問
My まだリリースされていない Delphi 2010アプリケーションを使用すると、ユーザーは自分のファイルをサーバーにアップロードできます。現在、私はファイルを送信するためにHTTPS POSTを使用しています、(単純化された)アルゴリズムは基本的に:
- ファイルを "スライス"に分割する(各256kb)
- 各スライスの場合は、それをサーバーに投稿します。
IE。 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()
私は indy 10 を使っています。 i(ab)は私のプロファイラを越えて使っていました、そしてアップロードルーチン自体の変更を除いて最適化するための残りはあまりありません。
私はマルチスレッドを使用しています。 大良いタイミング...私のアップロード日常のほぼ2倍の速い!)
私はそれが私のサーバーのせいではないことを知っています...私がまだ探求する必要があるアイデアは次のとおりです。
-
私は単一の投稿でスライスをグループ化しようとしましたが、これは当然パフォーマンス上昇(20~35%)をもたらしましたが、再開能力が低下しました。
-
私はsftp / sshの使用についても考えましたが、それが速いかどうかはわかりません。
-
Webソケットを使用して再開可能なアップロードを実装します(このコンポーネント)、わからないスピードのどちらか。
今私の質問は:アップロードをスピードアップするためにできることがありますか?私はコマンドラインツール(ライセンスが私のアプリケーションで発送することができる場合)を含む、私が実装できる any> の提案を開いています。
- 再開可能なアップロードがサポートされています
- 速い!
- 合理的なメモリ使用量
- セキュア&ユーザー認証/ユーザー認証
また、主要なセキュリティ上の懸念のため、FTPは私が実装したいものではありません。
たくさんありがとう!
-
解決
ファイル全体をまったく叩かずに単一のTIdHTTP.Post()
を実行することをお勧めします。TIdHTTP.OnWork...
イベントを使用して、必要に応じてどこから再開するかを知っているようにサーバーに送信されたバイトを追跡できます。再開すると、TIdHTTP.Request.CustomHeaders
プロパティを使用して、再開しているサーバーに伝えるカスタムヘッダーを含めることで、新しいデータを受け入れる前に、以前のファイルを特定のオフセットにロールバックすることができます。