Forum Discussion

C. Logan's avatar
C. Logan
Explorer | Level 3
9 years ago

Uploading big file using Objective-C API V2 very SLOW...

Hello,

 

recently our app updates the Dropbox related code from API V1 to API V2. Usually we need to transfer files to Dropbox, it is OK for small files, but for video files of size about 1.5 GB the progress is very slow, and often the upload is stopped due to request timeout.... 

 

We use the following API calls:

1. Start the upload

[client.filesRoutes uploadSessionStartData:data];

 

2. Repeatedly upload new chunk of data

[client.filesRoutes uploadSessionAppendV2Data:cursor inputData:chunk];

 

3. Finish upload for the last chunk

[client.filesRoutes uploadSessionFinishData:cursor commit:info inputData:chunk];

 

And the log messages are as follows:

 

2017-01-20 14:25:11.336692 MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0000

2017-01-20 14:25:11.343177MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0000

2017-01-20 14:25:11.349521MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0001

2017-01-20 14:25:11.353344MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0001

 

// Skip...

 

2017-01-20 14:25:55.059215MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0003

2017-01-20 14:25:55.070222MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0003

2017-01-20 14:26:17.700571MyApp[19184:6471639] start: bytesWritten = 65536 progress = 0.0003

2017-01-20 14:26:17.704239MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0003

2017-01-20 14:26:34.987083MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0004

2017-01-20 14:26:34.992280MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0004

2017-01-20 14:26:35.005880MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0004

 

// No data downloaded for about 23 sec

 

2017-01-20 14:26:58.848907MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0004

2017-01-20 14:26:58.855699MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0004

2017-01-20 14:26:58.871372MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0005

2017-01-20 14:26:58.873328MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0005

2017-01-20 14:27:15.431969MyApp[19184:6471639] start: bytesWritten = 65536 progress = 0.0005

2017-01-20 14:27:15.436307MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0006

2017-01-20 14:27:44.313052MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0006

2017-01-20 14:27:44.318937MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0006

2017-01-20 14:27:44.323024MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0006

2017-01-20 14:27:44.327415MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0006

2017-01-20 14:28:10.012220MyApp[19184:6471639] start: bytesWritten = 65536 progress = 0.0007

2017-01-20 14:28:10.015194 MyApp[19184:6471639] start: bytesWritten = 32768 progress = 0.0007

 

// Skip...

 

2017-01-20 14:59:18.994143 MyApp[19184:6471639] __70-[....]_block_invoke [Line 92] start: requestError = DropboxClientError[{

    NSError = "Error Domain=NSURLErrorDomain Code=-1001 \"\U8981\U6c42\U903e\U6642\U3002\" UserInfo={NSUnderlyingError=0x17025bb70 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 \"(null)\" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=https://api-content.dropbox.com/2/files/upload_session/start, NSErrorFailingURLKey=https://api-content.dropbox.com/2/files/upload_session/start, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=\U8981\U6c42\U903e\U6642\U3002}";

}];

 

2017-01-20 14:59:18.994833 MyApp[19184:6471639] __74-[...]_block_invoke_2 [Line 428] Failed To Upload /Horrible.Bosses.2011.DVDRip.XVID.AC3.HQ.Hive-CM8.avi

Error = DBRequestErrorClient

2017-01-20 14:59:18.995478 MyApp[19184:6475977] [] __tcp_connection_write_eof_block_invoke Write close callback received error: [89] Operation canceled

 

It can be seen from the log messages that the time the data arrived is not very smooth, and finally the operation is canceld.

 

My questions:

Is it pure network traffic problem?(Our network is relatively fast.)

Or is there something in API V2's upload API that causes the upload so slow?

 

Thanks for your attention.

 

Best regards,

Logan

 

  • Greg-DB's avatar
    Greg-DB
    Icon for Dropbox Staff rankDropbox Staff

    Hi Logan, are you using a chunk size of 32768 bytes? You should probably use something much larger than that, at least 4 MB, or even significantly larger than that.

     

    The optimal size depends on a variety of factors, so you may want to try a few different ones and see what works best for your app. Using a small chunk size can be useful, as it minimizes how much data you need to re-upload for failed requests, and reduces the chance of any particular request of failing, but it causes more overhead. A larger chunk size can reduce the overhead, which can improve overall transfer speed.

    • C. Logan's avatar
      C. Logan
      Explorer | Level 3
      Hi Greg,

      thanks for reply!

      1. I have tried to pass the chunk of data with size 5 MB and 100 MB, but the result was the same. It seems that the bytesWritten from the progress block is always 32768 and in few cases also 65536, as shown in the log message. How can I modify the data chunk size for each transfer? Currently I use the following code:

      NSData *data = [dropboxObj.fileHandle readDataOfLength:length]; // length = 5 MB or 100 MB or other values
      uploadTask = [client.filesRoutes uploadSessionStartData:data];

      2. Just a few minutes ago I tried to upload again, but there is no message from the progress block, and after one or two minutes the operation is canceled. My network is normal. So I guess there might be something wrong with the connection to Dropbox, or is there still anything in API V2 that I should know
      when doing the upload ?

      Thanks for your attention!

      Logan
      • Greg-DB's avatar
        Greg-DB
        Icon for Dropbox Staff rankDropbox Staff

        1. The chunk size should just be the size of the data you supply for any given call, and that's what should get reported back in the progress callback, so it's unexpected that you'd still get 32768. Can you share the rest of the relevant code, including the definition of length, the progresc callback definitifion, etc.?

         

        2. That also doesn't sound like the expected behavior. If you share the rest of the code and the steps to reproduce it we'll be happy to look into it.

About Dropbox API Support & Feedback

Node avatar for Dropbox API Support & Feedback
Find help with the Dropbox API from other developers.5,950 PostsLatest Activity: 9 hours ago
351 Following

If you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X or Facebook.

For more info on available support options for your Dropbox plan, see this article.

If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!