HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0320
ぺろ高速ファイルダウンロード13解決


ぺろ

リンク

2016/3/20(Sun) 00:24:22|NO.74977

hspinet.dllで扱えるnetloadでファイルをダウンロードしてもなかなかダウンロード速度が出ません。
例えば、IEやChromeなどのブラウザからファイルをダウンロードすれば確実にhspinet.dllのnetloadより早いですよね。
(こちらの環境ですが、ブラウザからダウンロードする分の10分の1以上遅いです)
何かいい方法はありませんか?誰か教えてください。よろしくお願いします。



この記事に返信する


(´ω`)

リンク

2016/3/20(Sun) 08:18:58|NO.74982

具体的なソースコードはちょいわからんのですが、
ダウンロードを高速化できる一般的なアイデアを。

・ftpが使えるサーバが相手
・相手はIPでの制限をかけていない
・あちらの転送速度はめちゃ余裕あり
・こちらの転送速度もめちゃ余裕

という条件であれば、分散ダウンロードという手があります。
対象ファイルのサイズを予め取得し、それをいくつかにわけて同時にリクエストを
するわけです。


例えば、ファイルAのサイズが1MBのものなら、256KB単位で4つにわけ、

 ・ファイルAの0〜256KBをください
 ・ファイルAの257〜512KBをください
 ・ファイルAの513〜768KBをください
 ・ファイルAの769〜1024KBをください

という4つのリクエストを同時に発行&同時にダウンロード処理をし、全て完了したら
結合して1つのファイルに戻します。


pcbnet2などの、複数のネットワーク同時処理が可能なプラグインを利用する必要が
ありますし、もし相手が、同じIPからの同時リクエストを無視&制限する仕組みで
あれば、これでもうまくいきませんのでもっとテクニカルな手段が必要になります。
(別サーバに一旦転送、そこから改めてダウンロードなど)

何かの参考になりましたら。(´ω`)



skyblue

リンク

2016/3/20(Sun) 09:20:15|NO.74983

ftpでなくても分散ダウンロードは出来ます。
制限されていなければ・・・・・



ぺろ

リンク

2016/3/20(Sun) 21:55:20|NO.74995


例えば、ファイルAのサイズが1MBのものなら、256KB単位で4つにわけ、  ・ファイルAの0〜256KBをください  ・ファイルAの257〜512KBをください  ・ファイルAの513〜768KBをください  ・ファイルAの769〜1024KBをください

このような事が出来そうな物をpcbnetで探してみましたが
何を使っていいのやら・・・。

ネットでも色々調べて見ましたが良いものが見つかりませんでした



zakki

リンク

2016/3/21(Mon) 00:02:09|NO.74998

plugins/win32/hspinet/czhttp.h で定義されてるバッファが4096バイトで
package/win32/common/hspinet.as でawait 50して50ms待つので
655kbpsくらいが上限になってる気がします。
とりあえずawait 0にしたnetload関数のバリエーションを自分で定義してみるのはどうでしょう。



kanamaru

リンク

2016/3/21(Mon) 00:33:46|NO.74999

Accept-Encodingになんか指定すれば、場合によっては速度上がるかも。
と言ってもhspinetじゃ指定出来ないけど。
というよりhspでAccept-Encoding指定した通信ってできるのかな?
勘違いが含まれていたらすいません。



skyblue

リンク

2016/3/21(Mon) 10:52:43|NO.75007

>というよりhspでAccept-Encoding指定した通信ってできるのかな?
出来ます。
ソケット通信を使えば
http*を使わなかったら出来ます。
サンプルの中にHTTP通信でHTMLを取得するものがあったはずです。

HTTP/1.1 index.html

とか送信するものがあったので、それにいろいろなヘッダーを自前でつければ出来ます。



ぺろ

リンク

2016/3/21(Mon) 11:46:22|NO.75009

さらに色々調べてみたんですが今も何も進まないままです・・・
分散ダウンロードもですし、かなり難易度高そうです・・



Y_repeat(旧y.tack)

リンク

2016/3/21(Mon) 12:03:40|NO.75010

自分、通信ほぼ使ったことないですが

Perl/Ruby/PHP等他言語の方が早いなら
DLするスクリプトをexecするとか



cats

リンク

2016/3/21(Mon) 14:24:42|NO.75011

hspinetやhspsockはほとんど使ったことが無いので分かりませんが、
wininetにはHttpAddRequestHeaders関数があって、
その名の通りリクエストヘッダを追加してからリクエストを送れます。
分割ダウンロードはやったことがありませんが、ヘッダにRangeを指定すると
(場合によるものの)指定バイトの範囲をダウンロードできるそうです。
ただし分割するときは一度にRangeに指定せず、
複数のリクエストを送信することに注意してください。
下のリンクはresumeについての質問と回答ですが、丁寧に説明されている上に
分割ダウンロードにも使えますので、参考までに。
http://stackoverflow.com/questions/25986659/resume-ability-for-a-simple-download-manager-c-wininet



cats

リンク

2016/3/21(Mon) 14:35:08|NO.75012

Rangeヘッダを付けたリクエストの書き方:
http://stackoverflow.com/questions/10470246/resume-aborted-download
HSPでHTTPの生のリクエスト、レスポンスを扱う:
http://www.orewp.net/hsp/tcp_ip/http.html



3k

リンク

2016/3/21(Mon) 23:31:07|NO.75018

う〜ん、雲行きが非常に怪しい、若干横槍気味に失礼。

> ぺろさん
全体的に話が分割ダウンロードの方に寄っていますが、zakkiさんのレス(NO.74998)は拾っていますか?

netload命令は実はhspinetの他の命令(netrequestとnetexec)をラップしただけのもので、中の処理を覗くことができます。
(hspinet本体は 「hspをインストールしたフォルダ」>common>hspinet.as に置いてあります。)

覗くと定義は次のようになっていることが分かると思いますが、

#deffunc netload str _p1 netrequest@ _p1 repeat netexec@ res if res : break await 50 loop if res > 0 : return neterror@ estr dialog "エラー:"+estr return #global
単純にリクエストを投げてnetexecしながら待っているだけですね。

大したことないんですがこの中身について簡単に説明すると、
1. netrequestでダウンロード対象となるファイルを指定する
2. netexecでダウンロード対象ファイル少しずつバッファに読み取って(ダウンロードして)、ファイルに書き出す
ということをしています。

この2の処理がとても大事でして、読み取ったファイルの中身を一時的に入れておくバッファのサイズは
現状はプラグイン側で決めうちで4096byte(4KiB)となっています。
(OpenHSPだとここ http://dev.onionsoft.net/trac/openhsp/browser/trunk/plugins/win32/hspinet/czhttp.h#L8

つまり一回のnetexecでファイルに書き込まれる内容はどんなに多くても4KiBなのですが、このループにはawait 50が挟まっていますね?
await 50は50ms単位で処理を回す命令なので、50msで4KiBだとすると、秒速およそ80KiB(bps表記だと655kbps)になります。

ということで、HSPの実装が根本からダメというより丁度使っていたnetloadがダメっぽいという話でした。
試しに、上記hspinet.asのawait 50となっているところをawait 0に書き換えて試してみてください。
あるいはnetloadではなく自分でnetrequestしてnetexecでスピンウェイト気味に待っていてもいいかと思います。(適度なawaitは恐らく必要でしょうが)
いずれにせよ、上述のような対処を行えばIEやFireFox、Chromeにそこまで大きな遜色がない程度の速度がでるかと思います。
とりあえず私の手元ではそうなりました、分散ダウンロードはかなり実装重い筈なのでその前に是非一度お試しを。

//============================================================================================
【余談ですが…。】
サーバー側とクライアント側とで回線が”よっぽど空いている場合は”確かに言うことはないのですが、
自分でサーバー持っている身としては分割ダウンロードは真面目にやってほしくない部類に入る行為なので、
どのようなソフトなのか分かりませんが出来れば通常のフローで処理して頂ければな、と思います。
(もし作っているものがご自分のサーバーとの通信で、全て許容できる範囲であるというなら上記の言は無視して下さって構いません)



ぺろ

リンク

2016/3/22(Tue) 00:27:48|NO.75021

kiさんのレス(No.74998)を拾って何度も読み返しましたが、自分の知識不足でなにをおっしゃっているのかが理解できませんでしたので、分散ダウンロードのほうに寄っていました。

そこで3kさんのレスを読んでみるとやっと理解できました。
netloadの仕様も理解せずnetloadを使用していた為、このような事態を招いてしまいました。
hspinet.asの中を見ると何をしているのかが理解できました。(まさかnetload命令がhspinetにもともとついている2つの命令をそのまま使っているとは思ってもいませんでした)
おかげで解決しました。今の所await50をawait0にして速度も格段に上がりました。今後は一つ一つの命令をじっくり見返してみなければいけないですね
この度はありがとうございました。



GravityNit

リンク

2016/4/3(Sun) 12:07:14|NO.75166

このスレッドに失礼します。

そういえば確かに、hspinetでのダウンロードはかなり遅いというのがわかりますね。
自作Webブラウザでフィッシング対策機能をつけようと思い、Phishtank.comから提供されている
フィッシング詐欺サイトのデータベースをnetrequestで受信させようとしたのですが
63MBとかなりのサイズで現行のhspinetの仕組みでは10数分、ADSLなどでは30分程度かかってしまう
こととなり、困っていました。

ふむふむ、hspinet.as側でのnetload関数が受信待ちで50msのウェイトをかけている・・・
ここも少し速度低下の1つなんですかね?

それと、hspinet.dllのnetrequest関数では、一度に受信するデータのサイズが4KB・・
ここが一番の速度低下の元なのでしょうか!? 4KBって・・・



ONION software Copyright 1997-2021(c) All rights reserved.