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 进行的处理,如果小文件还好一点,拷贝就是一瞬间的事情,但是如果是一个大文件 ...
随机推荐
- Python开发【模块】:CSV文件 数据可视化
CSV模块 1.CSV文件格式 要在文本文件中存储数据,最简单的方式是讲数据作为一系列逗号分隔的值(CSV)写入文件,这样的文件成为CSV文件,如下: AKDT,Max TemperatureF,Me ...
- Centos安装自定义布局才能自己划分各个区的大小ctrl+z ,fg ,route -n ,cat !$ ,!cat ,XShell 设置, ifconfig CentOS远程连接 Linux中的输入流 第一节课
Centos安装自定义布局才能自己划分各个区的大小ctrl+z ,fg ,route -n ,cat !$ ,!cat ,XShell 设置, ifconfig CentOS远程连接 Linux中 ...
- 深入理解Nginx
nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外 ...
- Singapore retailer will release this adidas NMD R1
Select spots are restocking the adidas NMD Singapore this Friday, Feb 24th featuring three different ...
- JDBC NOTE
JDBC 基本流程: 1. 加载驱动 a. SQLSERVER:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver&quo ...
- numpy模块学习笔记
# encoding=utf-8 import numpy as np from numpy.linalg import * def main(): # 1.最基本的array lst = [[1, ...
- 解决[Xcodeproj] Unknown object version错误
错误描述: RuntimeError - [Xcodeproj] Unknown object version. /Library/Ruby/Gems/2.0.0/gems/xcodeproj-0.2 ...
- Http请求中Content-Type
1. Content-Type MediaType,即是Internet Media Type,互联网媒体类型:也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求 ...
- Core Java 5
p273~p276: 1.获取异常的更多信息:e.getMessage(). 2.得到异常的实际类型:e.getClass().getName(). 3.当异常之间不存在子类关系,并且异常的处理机制( ...
- bzoj1600 [Usaco2008 Oct]建造栅栏(递推)
Description 勤奋的Farmer John想要建造一个四面的栅栏来关住牛们.他有一块长为n(4<=n<=2500)的木板,他想把这块本板 切成4块.这四块小木板可以是任何一个长度 ...