这是一个简单的获取远程文件大小的源码,我们可以改写为大批量异步的形式.
#include
#include size_t get_size_struct(void* ptr, size_t size, size_t nmemb, void* data){return (size_t)(size * nmemb);
}double get_download_size(char* url){CURL* curl;CURLcode res;double size = 0.0;curl = curl_easy_init();curl_easy_setopt(curl, CURLOPT_URL, url);curl_easy_setopt(curl, CURLOPT_NOBODY, 1L);curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, get_size_struct);curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);res = curl_easy_perform(curl);res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size);if(res != CURLE_OK){fprintf(stderr, "curl_easy_getinfo() failed: %s
", curl_easy_strerror(res));}curl_easy_cleanup(curl);return size;
}int main(int argc, char* argv[]){char url[] = "http://cdimage.ubuntu.com/releases/14.04/release/ubuntu-14.04-desktop-amd64+mac.iso";double filesize = get_download_size(url);printf("[%0.0lf] %s
", filesize, url);return 0;
}
下面是批量判断代码实现的结果
分析和思考:
获取远程文件大小中遇到的问题
CURLINFO_CONTENT_LENGTH_DOWNLOAD
Pass a pointer to a double to receive the content-length of the download. This is the value read from the Content-Length: field. Since 7.19.4, this returns -1 if the size isn't known.
使用这个项获取文件大小,比较受限制,它要求必须在http Response header中带有Content-Length头域才可以。如果没有就获取不了该长度。而我们知道,如果是chunked传输的时候,就肯定没有content-length头。所以还需要寻找其他的解决方法。
测试发现,使用这种方法,对大文件(超过2M)的长度获取还是准确的,但是对html页面的小文件,因为可能是gzip或是chunk传输的,获取的长度仅只能作为参考。比如未gzip压缩和gzip压缩的传输方式获取的长度肯定不是一样的。
采用这种方法,只能限制大,不限制小,因为小文件获取不精确。
在线上服务器上执行下面的命令 curl -vo /dev/null 'http://120.52.72.46:80/fileshare3010.dfiles.eu/c3pr90ntcsf0/auth-1375626538db3c073c81647e872cab8f-210.186.189.166-676861082-14640452...
使用libcurl多线程下载大文件的基本思想: 首选打开文件,将文件等分为指定的片段,使用http range下载,一个线程下载一个片段,当线程下载片段时,它们将数据写到打开文件的指定位置,类似BT文件下载的方式(这样片段下载完成后不用再合并),当所有的子线程下载完成后,这个大文件也就随之下载完成了。 下面是相关源码: //g...
这个例子来自参考文献[1], 那里有很多小bug,我都做了修改,在这里不一一说明了。ncurse界面编程比较容易入门,就是几个接口,网上资料很多,这里不详述了。
//gcc -g mget.c -o mget -lcurl -lncurses -lm
//
#include
在下面的源码中,我将展示如何使用libcurl提供的进度条功能,以及如何发送range请求, 同时提供了限速功能。
源码如下:
//g++ -g curl_range.cpp -o curl_range -lcurl -lm
//
#include
1. 定义网络的基本参数 定义输入网络的是什么: input = Input(shape=(240, 640, 3)) 反向传播时梯度下降算法 SGD一定会收敛,但是速度慢 Adam速度快但是可能不收敛 [link](https://blog.csdn.net/wydbyxr/article/details/84822806...
size_t和int size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef unsigned int size_t; 而在64位架构中被定义为: typedef unsigned lo...
我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入...
项目开发中需要从引擎 获取一定范围的数据大小,用作打点上报,测试过程中竟然发现写入了一部分数据之后通过GetApproximateSizes 获取写入的key的范围时取出来的数据大小竟然为0。。。难道发现了一个bug?(欣喜) 因为写入的数据是小于一个sst的data-block(默认是4K),会不会因为GetApproximate...