2 つのディレクトリ (ローカルとリモート) があります。ディレクトリが同期されます。ネットワークを遅くしたくありません。速度に動的制限を使用したい。そのため、ネットワーク速度 (アップロード用) を決定する必要があります。
ネットワーク速度を決定する方法 (アップロード用)? 何か案が?
2 つのディレクトリ (ローカルとリモート) があります。ディレクトリが同期されます。ネットワークを遅くしたくありません。速度に動的制限を使用したい。そのため、ネットワーク速度 (アップロード用) を決定する必要があります。
ネットワーク速度を決定する方法 (アップロード用)? 何か案が?
1 秒あたり X MB を送信したい場合は、X MB を送信し、1 秒未満の場合は、1 秒の終わりまで待ちます。送信している量を判断するには、データを送信するたびにカウンターを保持します。
私の問題は解決しました。ネットワーク速度を一時的に決定し、アップロード ファイル (またはダウンロード ファイル) ごとに動的な速度制限 (例: %50 未満) を使用したいと考えています。例えば; アップロード速度が毎秒 100kb の場合、動的に毎秒 50kb である必要があり、毎秒 150kb の場合、動的に毎秒 75kb である必要があります。
そのため、ファイルの最初のパッケージをアップロードして、bytes per second
. 私のアップロード速度です。次に、動的制限 (制限 = myUploadSpeed %50) を決定します。次に、スリープ時間を計算(sleep_duration=((myUploadSpeed-limit)/limit)*1000)
します (ミリ秒から秒に変換するには 1000 あります) 。if (limit>bytesPerSecond)
次のパケットが送信されるまで、次のパケットまで待ちます。sleep_duration
次のようにスロットルする私のコード:
private void throttle() throws IOException {
long limit= calculateMaxBytesPerSecond();
long bytePerSec= getBytesPerSec();
if (limit!=-1 && bytePerSec > limit) {
long sleep_duration=((bytePerSec-limit)/limit)*1000;
try {
if(sleep_duration==0)
Thread.sleep(1000);
else
Thread.sleep(sleep_duration);
totalSleepTime += SLEEP_DURATION_MS;
} catch (InterruptedException e) {
throw new IOException("Thread aborted", e);
}
}
}
private long calculateMaxBytesPerSecond() {
switch (streamType) {
case 0:
if(connectionManager.getDownloadSpeedLimit()>0)
return connectionManager.getDownloadSpeedLimit() / downloadManager.getTaskCount();
else
return -1;
case 1:
if(connectionManager.getUploadSpeedLimit()>0)
return connectionManager.getUploadSpeedLimit() / uploadManager.getTaskCount();
else
return -1;
}
return Long.MAX_VALUE;
}
public long getBytesPerSec() {
long elapsed = (System.currentTimeMillis() - startTime) / 1000;
if (elapsed == 0) {
return bytesRead;
} else {
return bytesRead / elapsed;
}
}