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实现大文件快速拷贝的更多相关文章

  1. 【HDFS API编程】从本地拷贝文件,从本地拷贝大文件,拷贝HDFS文件到本地

    接着之前继续API操作的学习 CopyFromLocalFile: 顾名思义,从本地文件拷贝 /** * 使用Java API操作HDFS文件系统 * 关键点: * 1)create Configur ...

  2. Linux大文件快速处理小方法

    背景 工作中使用MapReduce任务导出一批含有路径的文件,共计行数300W+,需要检测文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器,因此打算采用bash脚本进行.具 ...

  3. c#大文件的拷贝

    using System.IO; namespace 数据流 { class Demo2 { private string _strSourcePath = @"D:\httpd-2.4.3 ...

  4. C# IO操作(四)大文件拷贝(文件流的使用)、文件编码

         大文件拷贝(文件流的使用).文件编码 首先说一下大文件拷贝和文件流,因为计算机的内存资源是有限的,面对几个G甚至更大的文件,需要通过程序来完成拷贝,就需要用到文件流(因为我们无法做到把文件一 ...

  5. QQ上传大文件为什么这么快

    今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...

  6. U盘无法拷贝超过4G的大文件

    现在U盘的容量越来越大了,8G闪存满天飞,几乎已成“标配”,市面上再见难觅64M.128M等U盘的踪迹,可是细心的你也许已经发现,即使是8G或更大体积的U盘,仍然不能拷贝存储体积超过4G的大文件,这是 ...

  7. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

  8. PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)

    CSV大文件的读取已经在前面讲述过了(PHP按行读取.处理较大CSV文件的代码实例),但是如何快速完整的操作大文件仍然还存在一些问题. 1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容 ...

  9. renameTo()判断文件是否被占用(判断大文件是否完成拷贝这个动作)

    在开发需求中有一个需求是监控目录下拷贝进来的文件,并对文件进行处理, 使用的java.nio  . watchService 进行的处理,如果小文件还好一点,拷贝就是一瞬间的事情,但是如果是一个大文件 ...

随机推荐

  1. MongoDB: 原子性和事务

    在MongoDB中, 文档级别的的写操作是原子性的, 甚至是在对某个文档的操作中修改其多个内嵌的子文档, 也是原子性的. 在一个写操作同时修改多个文档的情况, 对其中单独的某个文档而言是原子的, 但是 ...

  2. 【转发】Python使用openpyxl读写excel文件

    Python使用openpyxl读写excel文件 这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取E ...

  3. [GDAL]编译64位GDAL1.10

    环境VS2010,swigwin-2.0.11 1. 打开nmake.opt文件,找到SWIG=swig.exe这一句,假如没有将swig的目录添加到环境变量中,那么将这句后面的swig.exe修改为 ...

  4. RedHat Linux文本模式下乱码解决方法

    如果在安装RedHat Linux时选择中文未缺省语言,在文本模式下会出现乱码情况,对于在CLI(command-line interface,命令行界面)方式下调试程序时诸多不便,因为出错信息全是乱 ...

  5. cocos代码研究(16)Widget子类RadioButton学习笔记

    理论基础 RadioButton是一种特定类型的两状态按钮,它与复选框相似.它可以 和RadioButtonGroup一起使用,形成一个"组".继承自AbstractCheckBu ...

  6. linux服务器查看IO

    为了方便各位和自己今后遇到此类问题能尽快解决,我这里将查看linux服务器硬盘IO访问负荷的方法同大家一起分享: 首先 .用top命令查看 top - 16:15:05 up 6 days,  6:2 ...

  7. 26. Remove Duplicates from Sorted Array(删除排序数组中的重复元素,利用排序的特性,比较大小)

      Given a sorted array, remove the duplicates in-place such that each element appear only once and r ...

  8. ng-深度学习-课程笔记-5: 深层神经网络(Week4)

    1 深度L层神经网络( Deep L-layer Neural network ) 针对具体问题很难判断需要几层的网络,所以先试试逻辑回归是比较合理的做法,然后再试试单隐层,把隐层数量当作一个超参数, ...

  9. HDU4112

    对于n*m*k的方块,用手掰成1**1的那么搜需要的步骤是固定的,为n*m*k-,如果用刀切,因为可以把多块叠在一起切,所以对于长度为n的,将他切成0,所需要的步骤数位k 对于n*m*k的方块,用手掰 ...

  10. 20145329 《网络对抗技术》PC平台逆向破解

    shellcode注入 实践是在非常简单的一个预设条件下完成的: (1)关闭堆栈保护 (2)关闭堆栈执行保护 (3)关闭地址随机化 (4)在x32环境下 (5)在Linux实践环境 shellcode ...