mmap实现大文件快速拷贝
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
#include<stdio.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/mman.h>
#include<string.h>
#include<strings.h>
#define MAXFILESIZE 128
#define MAXTHERAD 10
static int file_size;
static int new_file_size; //其实只用设置前面一个就好了,这里是开始写这段代码拿来测试文件空洞有没有形成
static char *file_point;
static char *new_file_point;
static int threadNum = 0;
//这些静态变量不赋初值默认都是0
void *pthFunc(void *args)
{
int i = threadNum++;
int srcpoint = (file_size/10)*i; //获取对应线程的拷贝起始点
int destpoint = srcpoint;
if(i!=9)
{
memcpy(new_file_point+destpoint,file_point+srcpoint,file_size/10);
}
else
{ //考虑最后一个线程拷贝的可能不足一块
memcpy(new_file_point+destpoint,file_point+srcpoint,file_size-srcpoint);
}
pthread_exit(NULL);
}
|
int main(int argc,char **argv)
{
if(2!=argc)
{
printf("error args\n");
return -1;
}
int fdr = open(argv[1],O_RDONLY,0666);
if(-1==fdr)
{
printf("fdr open error\n");
return -1;
}
char new_file_name[MAXFILESIZE];
sprintf(new_file_name,"%s%s","new_",argv[1]);
int fdw = open(new_file_name,O_CREAT|O_RDWR,0666);
if(-1==fdw)
{
printf("fdw open error\n");
return -1;
}
struct stat buf1,buf2;
bzero(&buf1,sizeof(buf1));
bzero(&buf2,sizeof(buf2));
fstat(fdr,&buf1);
file_size = buf1.st_size;
ftruncate(fdw,file_size);
fstat(fdw,&buf2);
new_file_size = buf2.st_size;
file_point = (char*)mmap(NULL,file_size,PROT_READ,MAP_SHARED,fdr,0);
//prot只是读权限,则文件描述符要有可读权限
new_file_point = (char*)mmap(NULL,new_file_size,PROT_WRITE,MAP_SHARED,fdw,0); //prot是写权限,则文件描述符要有可读可写权限
pthread_t pth[MAXTHERAD];
for(int i = 0;i<10;i++)
{
pthread_create(&pth[i],NULL,pthFunc,NULL);
}
printf("start copying\n");
for(int i = 0;i<10;i++)
{
pthread_join(pth[i],NULL);
}
printf("Done!\n"); //没有解除映射,不过进程结束自动解除
return 0;
}
|
mmap实现大文件快速拷贝的更多相关文章
- 【HDFS API编程】从本地拷贝文件,从本地拷贝大文件,拷贝HDFS文件到本地
接着之前继续API操作的学习 CopyFromLocalFile: 顾名思义,从本地文件拷贝 /** * 使用Java API操作HDFS文件系统 * 关键点: * 1)create Configur ...
- Linux大文件快速处理小方法
背景 工作中使用MapReduce任务导出一批含有路径的文件,共计行数300W+,需要检测文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器,因此打算采用bash脚本进行.具 ...
- c#大文件的拷贝
using System.IO; namespace 数据流 { class Demo2 { private string _strSourcePath = @"D:\httpd-2.4.3 ...
- C# IO操作(四)大文件拷贝(文件流的使用)、文件编码
大文件拷贝(文件流的使用).文件编码 首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个G甚至更大的文件,需要通过程序来完成拷贝,就需要用到文件流(因为我们无法做到把文件一 ...
- QQ上传大文件为什么这么快
今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...
- U盘无法拷贝超过4G的大文件
现在U盘的容量越来越大了,8G闪存满天飞,几乎已成“标配”,市面上再见难觅64M.128M等U盘的踪迹,可是细心的你也许已经发现,即使是8G或更大体积的U盘,仍然不能拷贝存储体积超过4G的大文件,这是 ...
- .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...
- PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
CSV大文件的读取已经在前面讲述过了(PHP按行读取.处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题. 1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容 ...
- renameTo()判断文件是否被占用(判断大文件是否完成拷贝这个动作)
在开发需求中有一个需求是监控目录下拷贝进来的文件,并对文件进行处理, 使用的java.nio . watchService 进行的处理,如果小文件还好一点,拷贝就是一瞬间的事情,但是如果是一个大文件 ...
随机推荐
- Mysql中的auto_increment
Mysql中的auto_increment 1.创建 2.使用 [1]如果不写固定列,则必须要插入该列,可以直接写Null,否则会报错 [2]可以直接在auto_increment 列上直接插入显式值 ...
- git-【七】bug分支
在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉. 比如我在开发中接到一个40 ...
- 23.如何查看一个keystore的具体签名信息
keytool -list -v -keystore zhangzu.keystore
- mariadb10.1.13GTID实现主从复制
---恢复内容开始--- 环境:centos6.5 mariadb:10.1.13-MariaDB GTID:GTID是有服务器的UUID和事务序号组成的唯一事务序号 ---UUID:N ...
- 3.5 Templates -- Binding Element Attributes(绑定元素属性)
一.概述 除了正常的文本,你可能还需要你的模板中包含的HTML元素的属性绑定到controller. 1. 例如,设想controller有一个属性包含一个图片的URL: <div id=&qu ...
- 创建工具条ToolBar
/***ToolBar***/ QToolBar * tlb_ImageOpen; QToolBar * tlb_VideoOpen; QToolBar * tlb_AudioOpen; void M ...
- 禁止复制操作 --《C++必知必会》条款32
class NoCopy{ private: //声明为私有的,则外部不可访问,即:不可复制 NoCopy(const NoCopy & );//复制构造函数 NoCopy & ope ...
- 网关服务Spring Cloud Gateway(一)
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- PHP文件锁 解决并发问题
使用多线程或是多进程时. 难免会遇到并发问题. 处理简单的并发可以使用这个办法来解决 flock($fp = fopen($lock, 'w+'), LOCK_EX | LOCK_NB) or e ...
- AVAudioFoundation(4):音视频录制
本文转自:AVAudioFoundation(4):音视频录制 | www.samirchen.com 本文主要内容来自 AVFoundation Programming Guide. 采集设备的音视 ...