2015-12-29 31 views
3

我正嘗試使用他們的Android移動服務將文件上傳到Microsoft Azure服務器。但問題出在上傳時,單個文件上傳會消耗所有可用帶寬。如何限制文件上傳的帶寬?

有沒有辦法限制單次上傳的帶寬?

我試過了什麼?

Azure服務可以採用塊文件。所以我定義塊大小50KB和每個連接最大帶寬限制爲100KB/s的

{ 
    t1=geTimeInMilliseconds(); 
    uploadChunk(); 
    t2=geTimeInMilliseconds(); 
    t3=t2-t1; 
    if(t3<500ms){ 
    sleep(500-t3); 
    } 
} 

我敢肯定這是不是這樣做的最佳方式。對此的任何建議將是一個很大的幫助..

+0

不能寫一個速率計算器來計算客戶端的上傳速率嗎? –

+0

@AlexSuo我這樣做只有rt?或者你的意思是還有其他事情要做?你能否詳細說明..謝謝.. – Praveen

回答

1

從I/O流的原則出發,簡單的思考上傳帶寬限制如下。

  1. 假設爲限速I/O數據流的是M Byte/sec,然後發送N Byte數據的成本時間是N/M sec
  2. 假設現在發送N Byte數據,那麼成本時間應該是N/M s。但是,實際的成本時間爲T s,所以發送線程應該睡眠(N/M - T) sec以實現極限速度。

以下是Java中的示例代碼作爲參考。

int BUF_SIZE = 1024; 
long speed = 12800L; // 100 Kbit/s = 100 * 1024/8 Byte/s = 12800 Byte/s 
File file = new File("<file path>"); 
OutputStream outs = ...; 
FileInputStream fis = new FileInputStream(file); 
byte[] buf = new byte[BUF_SIZE]; 
long cur = 0L; 
long startTime = System.currentTimeMillis(); 
while((n = fin.read(buf)) != -1) { 
    cur += n; 
    out.write(buf); 
    if(cur > speed) { 
     long idleTime = (cur-speed)*1000/speed; 
     Thread.sleep(idleTime); 
     cur = 0; 
     startTime = System.currentTimeMillis(); 
    } 
} 
fin.close(); 
outs.flush(); 
outs.close(); 
+0

在我的解決方案中,如果我將塊大小減少到一個字節,它將與您的rt相同的解決方案?還是會有任何開銷? – Praveen

+0

@Praveen從理論上講,但使用硬件如磁盤和內存不是一個好主意。效率低下。 –

+0

這個方法我只能跟在我發送到某個outputstream的時候。有沒有辦法在使用Azure等第三方API進行上傳時執行此操作.. – Praveen