精华内容
下载资源
问答
  • Windows 32位平台下超大文件读写源码 读写4G以上(64位长度,即unsigned __int64)的文件 示例源码,免费下载和使用
  • 文件读写时,read write fread fwrite都可以实现,如果文件很,耗时就特别长。 内存映射和分页读写可以解决这个问题,小弟对于读操作没疑问,对于写就有一个难题: 举例: 一个文件分成n页,我获取了第2页的内容...
  • Linux 下 C语言大文件读写(大于4G)

    千次阅读 2016-02-18 16:26:45
    如何create大文件就非常,1T吧。 有两种方法:   一.dd dd if=/dev/zero of=1T.img bs=1G seek=1024 count=0 bs=1G表示每一次读写1G数据,count=0表示读写0次,seek=1024表示略过1024个Block不写,...
    以下的做法整理自论坛上的帖子。  
    


    如何create大文件
    要大就非常大,1T吧。
    有两种方法:
     
    一.dd
    dd if=/dev/zero of=1T.img bs=1G seek=1024 count=0
    bs=1G表示每一次读写1G数据,count=0表示读写0次,seek=1024表示略过1024个Block不写,前面blocksize是1G,所以共略过1T!
    这是创建大型sparse文件最简单的方法。
     
    二.ftruncate64/ftruncate
    如果用系统函数就稍微有些麻烦,因为涉及到宏的问题。我会结合一个实际例子详细说明,其中OPTION标志的就是测试项。
    文件sparse.c:
     
    //OPTION 1:是否定义与大文件相关的宏
    #define _LARGEFILE_SOURCE
    #define _LARGEFILE64_SOURCE
    #define _FILE_OFFSET_BITS 64

     
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <string.h>
    #define FILENAME "bigfile"
    #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
    int main(int argc, char **argv)
    {
      int fd, ret;
      off_t offset;
      int total = 0;
      if ( argc >= 2 )
      {
      total = atol(argv[1]);
      printf("total=%d/n", total);
      }
     
      //OPTION 2:是否有O_LARGEFILE选项
      //fd = open(FILENAME,O_RDWR|O_CREAT|O_LARGEFILE, 0644);
      fd = open(FILENAME, O_RDWR|O_CREAT, 0644);
      if (fd < 0) {
      perror(FILENAME);
      return -1;
      }
      offset = (off_t)total*1024ll*1024ll*1024ll;
      printf("offset=%ld/n", offset);
     
      //OPTION 3:是否调用64位系统函数
      //if (ftruncate64(fd, offset) <0)
      if (ftruncate(fd, offset) <0)
      {
      printf("[%d]-ftruncate64 error: %s/n", errno,strerror(errno));
      close(fd);
      return 0;
      }
      close(fd);
      printf("OK/n");
      return 0;
    }
     
    测试环境:
    linux:/disk/test/big # gcc --version
    gcc (GCC) 3.3.5 20050117 (prerelease) (SUSE Linux)
    linux:/disk/test/big # uname -a
    Linux linux 2.6.11.4-20a-default #1 Wed Mar 23 21:52:37 UTC 2005i686 i686 i386 GNU/Linux
     
    测试结果(伪码表示):
    1.宏定义完全的情况下:
    IF {O_LARGEFILE=TRUE &&ftruncate64=TRUE}
      OK;
    ELSEIF {O_LARGEFILE=FALSE &&ftruncate64=TRUE}
      OK;
    ELSEIF {O_LARGEFILE=FALSE &&ftruncate64=FALSE}
      运行不报错,但是不支持>4G;
    ELSEIF {O_LARGEFILE=TRUE &&ftruncate64=FALSE}
      运行不报错,但是不支持>4G;
    【结论】:在宏定义完全的情况下,是否调用ftruncate64,是决定支持4G以上文件的关键,O_LARGEFILE无作用。
     
    2.宏定义不完全:缺少_FILE_OFFSET_BITS
    首先声明一点,O_LARGEFILE需要定义_LARGEFILE64_SOURCE。
    IF {O_LARGEFILE=TRUE &&ftruncate64=TRUE}
      产生不正常超大文件;
    ELSEIF {O_LARGEFILE=FALSE &&ftruncate64=TRUE}
      产生不正常超大文件;
    ELSEIF {O_LARGEFILE=FALSE &&ftruncate64=FALSE}
      运行不报错,但是不支持>2G;
    ELSEIF {O_LARGEFILE=TRUE &&ftruncate64=FALSE}
      运行不报错,但是不支持>4G;
    【结论】:未定义_FILE_OFFSET_BITS的情况下,ftruncate64调用是非法的,会产生无法预料的后果,这里的测试就是产生一个超大文件(>1T),我也无法解释其原因;O_LARGEFILE的作用就是在32位系统中支持大文件系统,允许打开那些用31位(2G)都不能表示其长度的大文件;此外,off_t为unsignedint类型,也就是说最多只能达到4G,所以ftruncate最大支持4G文件。
     
    总结一下:如果要支持超过2G的文件,至少需要定义_LARGEFILE64_SOURCE宏,并且设置O_LARGEFILE选项;如果要支持超过4G,需要定义所有上述的宏,并且调用ftruncate64;其余的搭配都是错误的!
     
    【附】:
    dd 的主要选项:
    指定数字的地方若以下列字符结尾乘以相应的数字:
    b=512, c=1, k=1024, w=2, m=1024k, g=1024m
    大小写不限。
    if=file
    输入文件名,缺省为标准输入。
    of=file
    输出文件名,缺省为标准输出。
    ibs=bytes
    一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
    obs=bytes
    一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
    bs=bytes
    同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。
    cbs=bytes
    一次转换 bytes 个字节,即转换缓冲区大小。
    skip=blocks
    从输入文件开头跳过 blocks 个块后再开始复制。
    seek=blocks
    从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)
    count=blocks
    仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
    conv=conversion[,conversion...]
    用指定的参数转换文件。
    转换参数:
    ascii 转换 EBCDIC 为 ASCII。
    ebcdic 转换 ASCII 为 EBCDIC。
    ibm 转换 ASCII 为 alternate EBCDIC.
    block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。
    unblock
    使每一行的长度都为 cbs ,不足部分用空格填充。
    lcase 把大写字符转换为小写字符。
    ucase 把小写字符转换为大写字符。
    noerror
    不显示错误
    notrunc
    不截短输出文件。
    sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

    本文转自:
    http://blog.sina.com.cn/s/blog_5c93b2ab0100vhk1.html
    展开全文
  • Windows的内存映射,大文件读写

    千次阅读 2011-09-29 10:28:33
    Windows上,内存映射文件,使得大文件读写不会消耗太多的内存,也减少了频繁的cpu指令。另外,windows上的进程间共享数据,也是通过内存映射文件的方式来实现。 刚好又遇到这个需求,需要在服务器上一次载入几十...
     
    

    Windows上,内存映射文件,使得大文件的读写不会消耗太多的内存,也减少了频繁的cpu指令。另外,windows上的进程间共享数据,也是通过内存映射文件的方式来实现。
    刚好又遇到这个需求,需要在服务器上一次载入几十兆大小的文件,每个文件大约有100万条数据。所以温习一下这块内容。
    使用内存映射文件,需要按下列操作步骤操作:
    1,打开一个文件对象,也就是文件句柄了。
    2,创建一个文件映射对象 。
    3,获取文件映射对象在进程地址空间的指针。
    当完成对内存映射文件操作时,执行下面这些步骤清理内存:
    1,告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
    2,关闭文件映射对象。
    3,关闭文件句柄。
    内存映射可以高效的对大文件进行读写操作,可以这样理解,这个文件在物理磁盘上的存储空间被作为虚拟内存使用了,你读写这块内存区域,就相当于读写文件。在效率上,比I/O文件系统高了很多。win32上的进程间消息传递SendMessage和PostMessage都是用到这种方法。
    实际上如果只是单纯使用它,就不必深究原理,否则需要去看《Windows核心编程》。
    代码是硬道理:
    假设在E盘有一个测试文件test.txt,内容如下:

    执行以下代码:

    #include "windows.h"
    #include "stdio.h"
     
    intmain()
    {
        //文件对象
        TCHAR STR[] = "hello world!";
        HANDLEhFile = CreateFile("E:\\test.txt",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
        //映射对象
        HANDLEhFileMapping = CreateFileMapping(hFile,
        NULL,
        PAGE_READWRITE,
        0,
        0,
        NULL);
        //这里赋值了2个文件映射的指针,地址从文件头开始
        TCHAR*pbFile1 = (TCHAR*)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
        TCHAR*pbFile2 = (TCHAR*)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
        /*
        输出字符串的内容,可以看到的是,把整个文件当作字符串输出了。
        当然,如果文件中含有'\0'的字符,你看不到全部文件内容的输出。
        */
        //两个输出的结果是一样的
        printf("%s\n", pbFile1);
        printf("%s\n", pbFile2);
        /*
        下面的操作是往这个pbFile1指向的地址写入点自定义的内容,
        然后比较pbFile2指向地址的值是否相应改变了。
        */
        memcpy(pbFile1, STR, strlen(STR));
        printf("%s\n", pbFile1);
        printf("%s\n", pbFile2);
        //清理指针和内存
        UnmapViewOfFile(pbFile1);
        UnmapViewOfFile(pbFile2);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        return0;
    }


    看到的输出是这样的:

    打开刚才那个test.txt,结果是这样的:

    原理很复杂,用法很简单,over!

    展开全文
  • mmap函数大文件读写可能出现的问题

    千次阅读 2012-03-16 15:02:32
    ------------------------------------------------------------------------- ... mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要

    转载:http://www.chineselinuxuniversity.net/articles/41953.shtml

    -------------------------------------------------------------------------

     mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。

      关于mmap的内容请看《Unix环境高级编程》12章。在这里,说一下使用mmap函数时可能遇到的问题:

      //下面的代码把文件1.ls中的内容通过mmap函数写入2.ls中,忽略出错处理

      int fd=open("1.ls",O_RDONLY);

      int fd2=open("2.ls",O_CREAT|O_RDWR|O_TRUNC,S_IRUSR|S_IWUSR);//必须设置读写权限,若只有写权限,会产生SIGSEGV信号

      //mmap进行文件映射时必须先读取文件`

      struct stat st;

      fstat(fd,&st);

      lseek(fd2,st.st_size-1,SEEK_SET);

      write(fd2,"",1);        //必须的,如果不设置,当写入数据的时候会遇到文件结束符,产生SIGBUS信号

      void *_src=mmap(NULL,st.st_size,PROT_READ,MAP_SHARED, fd,0);

      void *_des=mmap(NULL,st.st_size,PROT_WRITE,MAP_SHARED,fd2,0);

      close(fd);      //关闭文件后 依然可修改文件内容

      close(fd2);

      memcpy(_des,_src,st.st_size);

      总结一下,可能产生的问题如下:

      1.进行文件映射的描述符必须拥有读权限,否则会产生SIGSEGV信号

      2.把内存内容写入映射文件时,必须确保被写文件当前位置到文件结尾的长度不小于所写内容长度,否则产生SIGBUS信号

      3.关闭文件描述符并不能保证文件内容不被修改

      4.munmap并不能使映射的内容写回磁盘


    展开全文
  • python文件读写

    千次阅读 2017-05-17 20:40:59
    python大文件读写 内置方法 pandas 分块生成批量数据python普通文件读写 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 常用的参数有文件路径file和...

    python普通文件读写

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    常用的参数有文件路径file和读写模式mode

    字符含义
    ‘r’只读模式(默认)
    ‘w’只写模式
    ‘a’追加写模式
    ‘b’二进制模式
    ‘t’文本模式(默认)
    ‘+’更新模式(一般和其他模式并用)

    打开的文件描述符有以下几个常用的函数

    读写函数

    read & write

    f = open(yourfilepath, 'r')
    ss = f.read()  # 读进文件的全部内容返回一个字符串
    ss = f.read(1024)  # 读取指定字节的内容返回一个字符串
    
    line = f.readline()  # 读取文件的一行返回字符串(包含换行符)
    line = line.strip("\n")  # 处理的时候一般要去掉换行符(这里是\n)
    
    lines = f.readlines()  # 读取所有行返回一个列表list,每个元素(类型为字符串)为文件的一行
    for line in f.readlines():
        pass
    f.close()  # 文件用完要记得关闭,可以用with关键字,不用手动关闭,程序会自动关闭
    
    # 以下均用with来读写文件
    with open('yourfilepath', 'w') as tmpf:
        a = 100; b = 97.5; c = 'Good'
        tmpf.write('number=%d  score=%f  result%s' % (a, b, c))
        # 或者直接写入文件内容——字符串(或二进制数据)
        ss = 'yourstring'
        f.write(ss)  # 直接写入
    
    ss = 'yourstring'
    f.writeline(ss)  # 写入时会自动加入换行符
    
    ss = ['a', 'b', 'c']
    f.writelines(ss)  # 参数为字符串序列

    python大文件读写

    内置方法

    大文件读写的时候如果使用上面的函数内存分分钟会爆掉,需要使用python的生成器
    open函数返回的其实还是一个生成器,不管文件多大,可以一行一行读取

    with open(yourfilepath,'r') as f:
        for line in f:
            pass  # 对每行做处理

    pandas

    pandas的read_csv函数可以分块读取数据

    ### 分批加载训练集
    chunksize = 10000
    reader = pd.read_table(yourfile, chunksize=chunksize)
    for line in reader:
        pass  # 对每行做处理
    
    # 或者使用iterator获得迭代对象
    reader = pd.read_table(yourfile, iterator=True)
    loop = True
    while loop:
        try:
            chunk = reader.get_chunk(chunkSize)
            pass  # 对每行做处理
        except StopIteration:
            loop = False

    分块生成批量数据

    在深度学习中,经常需要送入批量数据,可以使用生成器来完成

    import numpy as np
    import pandas as pd
    
    # batch_size为皮尺寸
    # datapath为数据集路径
    # labelpath标签路径
    def data_iter(batch_size, datapath, labelpath):
        train_x = pd.read_csv(datapath)
        train_y = pd.read_csv(labelpath)
        while(1):   # 死循环,因为数据要循环读取,epoch的缘故
            nb_batch = np.ceil(train_x.shape[0] * 1.0 / batch_size)
            for i in range(int(nb_batch)):
                start = i*batch_size
                end = min((i+1)*batch_size, train_x.shape[0])
                # 生成器生成需要的数据(X,Y)
                yield (train_x[start:end], train_y[start:end])

    参考网站
    1 使用Python Pandas处理亿级数据
    2 pandas.read_csv——分块读取大文件
    3 pandas.read_csv参数整理
    4 The Python Standard Library I/O
    5 强悍的 Python —— 读取大文件
    6 python:open函数的使用方法
    7 Python读写文件
    8 python 如何读取大文件
    9 Python linecache模块缓存读取大文件指定行
    10 python读文件的三个方法read()、readline()、readlines()详解

    展开全文
  • java实现超大文件读写

    千次阅读 2014-12-08 12:58:37
    一、对于几百M或上G的文件可使用java nio进行读写 , 根据个人的需求 可能需要将一个超大文件读写形成很多较小的文件进行分析,这也不是什么难事,在读完一个缓冲区后 更换写入的对象即可,本文就不做详细介绍了...
  • MFC INI文件读写

    热门讨论 2010-08-06 23:27:50
    MFC INI文件读写;MFC INI文件读写;MFC INI文件读写;MFC INI文件读写;MFC INI文件读写;
  • android文件读写,ndk文件读写

    千次阅读 2014-06-26 09:38:26
    1 android文件读写相关文章
  • c++文件读写

    千次阅读 2019-08-12 23:33:30
    //文件读写 using namespace std; void test() { //地址中的斜杠要么写双反斜杠,要么写单正斜杠 char sourceName[] = "C:\\Users\\Polaris\\Desktop\\source.txt"; //源文件地址 char ...
  • js读写本地文件js读写本地文件

    热门讨论 2010-06-03 13:18:26
    js读写本地文件js读写本地文件js读写本地文件js读写本地文件js读写本地文件
  • linux C文件读写

    热门讨论 2012-12-27 10:41:40
    linux C文件读写 初学练手代码 内容很简单,就实现简单的文件读写功能
  • php大文件快速读写的实现

    千次阅读 2017-12-28 18:12:07
    使用php的标准库类SplFileObject,实现大文件读写。因为一次请求有一定的生命周期,所以必须要在请求超时之前完成当前处理。其中,大文件的读取和写入会严重影响处理时间,因此php提供了对于大文件进行操作的面向...
  • C语言文件读写(1)-文本文件读操作

    万次阅读 多人点赞 2020-06-30 12:40:09
    C语言文件读写-之文本文件读写
  • VC读写ini文件VC读写ini文件

    热门讨论 2010-11-26 10:52:24
    VC读写ini文件,VC读写ini文件.rar,VC读写ini文件.rar,VC读写ini文件.rar,VC读写ini文件.rar,
  • C++读写txt文件(基本操作1)

    万次阅读 多人点赞 2017-11-30 17:49:02
    本博客主要写了用C++读写txt本文的基本操作,最简单的写入和读出两个基本操作。 本程序的功能是向Test.txt文件文件写入字符串"This is a Test12!"和读取字符串"This is a Test12!",并且将读取到的字符串存到temp...
  • c语言文件读写操作

    万次阅读 多人点赞 2019-03-20 20:15:35
    当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名...
  • linux下文件读写

    千次阅读 2019-06-23 10:25:26
    linux 下一切皆文件 文件读写 文件的打开open函数 涉及头文件: ubuntu 头文件所在目录:/usr/include/x86_64-linux-gnu/sys #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> ...
  • C语言 文件读写的实现

    万次阅读 多人点赞 2019-04-26 11:55:33
    关于C语言的文件读写,我将介绍下面这几种方式: 字符的读写:使用 fgetc() 函数 和 fputc() 函数; 字符串的读写:使用 fgets() 函数和 fputs() 函数; 格式化的读写(主要用于文本文件):使用 ...
  • JNI 文件读写

    千次阅读 2017-08-20 17:51:22
    对于只要入门了的Java工程师,写一个文件读写的功能是相当的简单,但是通过JNI进行文件的读写,相信有很多人都没去做过。当然对于JNI入门了的开发人员来说,这只是小菜一碟而已。 今天我也来试试JNI如何实现文件...
  • 文件读写

    千次阅读 2018-10-21 18:35:59
    1.归纳文件读写格式,细节如下: &amp;quot;r&amp;quot; 打开,只读; &amp;quot;w&amp;quot; 打开,文件指针指到头,只写; &amp;quot;a&amp;quot; 打开,指向文件尾,在已存在文件中...
  • MATLAB03:数据类型与文件读写

    万次阅读 多人点赞 2019-11-14 13:13:44
    文章目录MATLAB03:数据类型与文件读取数据类型数值类型(numeric)字符串类型(char)结构体(structure)结构体的基本使用结构体的常用函数元胞数组(cell)元胞数组的基本使用元胞数组的常用函数高维元胞数组判断变量数据...
  • Python读写文件

    2019-11-20 20:48:50
    1、使用Python读写文件一项基本技能,该课程中详细讲解了三种常用的文件读写方式 2、详细讲解了os模块中如何操作文件和路径,更好的辅助完成文件的读写操作,熟练对os模块的使用
  • C语言文件读写函数总结

    千次阅读 多人点赞 2018-04-30 23:51:59
    一、字符读写 1、字符写入文件函数 fputc 2、从文件中读取字符 fgetc 二、字符串的读写 1、字符串写入文件函数 fputs 2、从文件中读取字符 fgets 三、块数据读写 1、向文件中写入块数据fwrite 2、从文件中...
  • Qml读写文件

    千次阅读 2019-04-23 21:41:14
    利用qmlRegisterType接口注册一个文件操作类到Qml中,这样Qml就可以实现读写文件
  • 大文件多线程读写操作

    千次阅读 2018-07-03 00:52:40
    对于一个比较的数据文件, 如:20G, 每一行为一个数据单元,在不进行文件切割的前提下, 想利用多线程处理文件中的每行数据。 如果依次读取文件中每一行并处理则处理速度较慢较慢; 全部读取再处理机器的内存不能...
  • c++文件读写操作

    万次阅读 多人点赞 2018-04-17 11:07:00
    近期适配几款游戏的数据,因为重复量太,因此写一个对数据进行处理的程序,下面是整个过程中接触到的一些东西。以下内容转载自:https://www.cnblogs.com/1242118789lr/p/6885691.html。fstream提供了三个类,用来...
  • Android中的文件读写操作是不可或缺的,每个应用都会涉及到读写操作。这里将读写操作分成了四个部分 assets文件夹中文件数据的读取 raw文件夹中的文件数据的读取 Android内部存储文件的读写 Android外部存储文件的...
  • VC++ 文件读写总结

    千次阅读 2017-04-02 11:55:04
    一、文件打开函数概述 ..._sopen 函数将打开由 filename 指定的文件并使该文件做好共享的读写准备 3.fopen: fopen 函数打开 filename指定的文件 4.freopen: freopen函数将关闭当前与相关联的文件stream,并重新指
  • STL文件读写基础

    千次阅读 2014-01-18 06:43:51
    STL文件读写基础 stl中对文件读写的函数在头文件fstream中定义,它的基本对象模型如下: 其中包含三个对象ifstrea、ofstream和fstream,分别对文件提供只读、只写、读写功能,从其对象继承关系也可以看出这一点。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 951,794
精华内容 380,717
关键字:

大文件读写