Is there an optimal byte size for sending data over a network?

后端 未结 9 2124
既然无缘
既然无缘 2021-02-19 15:25

I assume 100 bytes is too small and can slow down larger file transfers with all of the writes, but something like 1MB seems like it may be too much. Does anyone have any sugge

9条回答
  •  醉酒成梦
    2021-02-19 16:14

    Make a function named CalcChunkSize Add some private variables to your class:

    Private PreferredTransferDuration As Integer = 1800 ' milliseconds, the timespan the class will attempt to achieve for each chunk, to give responsive feedback on the progress bar.
    Private ChunkSizeSampleInterval As Integer = 15    ' interval to update the chunk size, used in conjunction with AutoSetChunkSize. 
    Private ChunkSize As Integer = 16 * 1024           ' 16k by default  
    Private StartTime As DateTime
    Private MaxRequestLength As Long = 4096            ' default, this is updated so that the transfer class knows how much the server will accept      
    

    Before every download of a chunk, check if its time to calculate new chunksize using the ChunkSizeSampleInterval

                Dim currentIntervalMod As Integer = numIterations Mod Me.ChunkSizeSampleInterval
                If currentIntervalMod = 0 Then
                    Me.StartTime = DateTime.Now
                ElseIf currentIntervalMod = 1 Then
                    Me.CalcChunkSize()
                End If
    

    numIterations is set to 0 outside the download-loop and after every downloaded chunk set to numIterations += 1

    Have the CalcChunkSize doing this:

    Protected Sub CalcAndSetChunkSize()
        ' chunk size calculation is defined as follows 
        ' * in the examples below, the preferred transfer time is 1500ms, taking one sample. 
        ' * 
        ' * Example 1 Example 2 
        ' * Initial size = 16384 bytes (16k) 16384 
        ' * Transfer time for 1 chunk = 800ms 2000 ms 
        ' * Average throughput / ms = 16384b / 800ms = 20.48 b/ms 16384 / 2000 = 8.192 b/ms 
        ' * How many bytes in 1500ms? = 20.48 * 1500 = 30720 bytes 8.192 * 1500 = 12228 bytes 
        ' * New chunksize = 30720 bytes (speed up) 12228 bytes (slow down from original chunk size) 
        ' 
    
        Dim transferTime As Double = DateTime.Now.Subtract(Me.StartTime).TotalMilliseconds
        Dim averageBytesPerMilliSec As Double = Me.ChunkSize / transferTime
        Dim preferredChunkSize As Double = averageBytesPerMilliSec * Me.PreferredTransferDuration
        Me.ChunkSize = CInt(Math.Min(Me.MaxRequestLength, Math.Max(4 * 1024, preferredChunkSize)))
        ' set the chunk size so that it takes 1500ms per chunk (estimate), not less than 4Kb and not greater than 4mb // (note 4096Kb sometimes causes problems, probably due to the IIS max request size limit, choosing a slightly smaller max size of 4 million bytes seems to work nicely) 
    End Sub
    

    Then just use the ChunkSize when requesting next chunk.

    I found this in the "Sending files in chunks with MTOM web services and .Net 2.0" by Tim_mackey and have found it very useful myself to dynamically calculate most effective chunksize.

    The source code in whole are here: http://www.codeproject.com/KB/XML/MTOMWebServices.aspx

    And author here: http://www.codeproject.com/script/Membership/Profiles.aspx?mid=321767

提交回复
热议问题