最近在分析一个35G的大数据文件,猛一看,是不是很吓人啊,不过还好,师兄写文件的格式非常规范,读取数据来也就很方便了,主要是使用了读写文件的两个函数fread和fwrite,下面用matlab简单尝试一下,对于这种文件读取的低级函数,c和matlab功能都是差不多的。

先来看fwrite,最简单的用法如下

%%

x = 1:15;

dataw = reshape(x, 5, 3);

disp(dataw)

%%

filename = 'test.bin';

hfile = fopen(filename, 'w');

fwrite(hfile, dataw, 'double');

fclose(hfile);

fwrite写矩阵,是按列来写的,即先写第一列,再第二列,以此类推。如上面的代码,x为

1     6    11

2     7    12

3     8    13

4     9    14

5    10    15

如果把数据全部读出来,就是

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

稍复杂的写法是,可以跳着写,就是每个数据先跳几个位置,然后再写数据,如上面的5X3矩阵,如果想按行来写,当然最简单的方式是先转置一下再写,但如果数据量非常大,而且还在另一个文件里,总不能先都读取进来,再转置、写,当然这只是一种特殊情况,但跳着写在某些时候确实是好的解决方法,如下实现按行写

%%

x = 1:15;

dataw = reshape(x, 5, 3);

disp(dataw)

len = 5;

count = 3;

%%

filename = 'test.bin';

hfile = fopen(filename, 'w');  

fwrite(hfile, zeros(count, 1), 'double'); % 先写一行0,因为fwrite总是先跳再写,对于第一行也要先跳,那就先在第一行补个零吧

for i = 1:count

    fseek(hfile, 8*i, 'bof'); % 常常要配合fseek使用 fseek(fid,offset,origin);

% double 在matlab 中是 'real*8' 表示64位共8字节的浮点数

%所以上面的fwrite(hifle,zeros(count,….) 写入了24个字节的数据

%因为fwrite写入数据后会把当前指针hfile移动到最后一个字节位置, 所以此时ftell(hfile)就为24了

    fwrite(hfile, dataw(1:end, i), 'double', 8*(count-1)); % fwrite(fid,A,precision,skip)

%fwrite(hfile,dataw(1:end,1),…)这一行表示将dataw矩阵中的第一列数据1 2 3 4 5 每隔16个字节(因为这里用的double型,每个数据位占用了8字节)写入一个数据

%因为fwrite()是先跳后写入,即在写入dataw中第一列的第一个数据值1之前hfile在当前指针所指字节数的位置向前跳8*(count-1)个字节,然后写入这个数值1(这个1占用了8个字节,共64位),然后再跳8*(count-1)个字节,接着写入数值2(dataw的第一列第二个值),直到把这列数据写完!然后继续循环

    %dataw(1:end,i)表示取矩阵的第i列,可写为dataw(:,i)

end

fclose(hfile);

hfile = fopen(filename, 'r');

datar = fread(hfile, 100, 'double')

fclose(hfile);

结果如下

     1     6    11

     2     7    12

     3     8    13

     4     9    14

     5    10    15

datar =

     0

     0

     0

     1

     6

    11

     2

     7

    12

     3

     8

    13

     4

     9

    14

     5

    10

    15

 

fwrite写的文件再配合上fread读,那真是天作之合了,35G的数据也是浮云啊!

最简单的读取方式就是上面的

datar = fread(hfile, 100, 'double')

直接读取100个数据。当然更灵活的是跳着读,如下面的程序

%%

x = 1:15;

dataw = reshape(x, 5, 3);

disp(dataw)

%%

filename = 'test.bin';

hfile = fopen(filename, 'w');

fwrite(hfile, dataw, 'double');

fclose(hfile);

%% 跳着读

ind = 2; % 读第几时刻的数据

len = 5; % 一次数据的长度

hfile = fopen(filename, 'r');

fseek(hfile, 8*(ind - 1), 'bof');

datar = fread(hfile, 3, 'double', 8*(len - 1)); % double为8个字节

fclose(hfile);

disp(datar)

结果如下

1     6    11

2     7    12

3     8    13

4     9    14

5    10    15

2

7

12

这意思就是,文件中存储的数据为1到15,但如果我想读取上面矩阵中的第一行,即1,6,11,那就可以跳着读,但注意跳着读时,第一个数据是不跳直接读的,帮助里的说明是skips skip bytes after reading each value,这是和fwrite不同的地方,skips skip bytes before writing each value,所以上面fwrite跳着写的时候要先补一下0,再跳着写,方便一些。

 

源文档 <http://blog.sina.com.cn/s/blog_6163bdeb0102dqtk.html>

Matlab 用fread、fwrite实现大文件读写的更多相关文章

  1. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码.fileC ...

  2. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. Mapped ...

  3. vc关于大文件读写

    http://blog.csdn.net/believefym/article/details/1162461 在做tcp发送大文件的问题时,怎么读取大文件,现在还没有这方面的需求,留作以后处理: 在 ...

  4. C++ 大文件读写

    //你必须映射一个只包含一小部分文件数据的文件视图.首先映射一//个文件的开头的视图.当完成对文件的第一个视图的访问时,可以取消它的映像,然后映射//一个从文件中的一个更深的位移开始的新视图.必须重复 ...

  5. jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

    day17总结 今日内容 l JDBC 1.1 上次课内容总结 SQL语句: 1.外键约束:foreign key * 维护多个表关系! * 用来保证数据完整性! 2.三种关系: * 一对多: * 一 ...

  6. C++文件读写函数之——fopen、fread和fwrite、fgetc和fputc、fgets和fputs、ftellf和fseek、rewind

    由于最近经常使用到c语言中的读写文件,所以在此总结以下,方便以后查找. 在c中,文件操作都是由库函数来实现的,主要是分为读和写两种操作,以下详细讲解以下所有有关文件操作的邯郸乎的用法: //C++写入 ...

  7. (转载)C++文件读写函数之——fopen、fread和fwrite、fgetc和fputc、fgets和fputs、ftellf和fseek、rewind

    http://blog.sina.com.cn/s/blog_61437b3b0102v0bt.html http://blog.csdn.net/chenwk891/article/details/ ...

  8. 通过文件读写方式实现Matlab和Modelsim的联合仿真

    虽然Modelsim的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法的仿真验证的时候,则显得有点不足.而进行数字信号处理是Matlab的强项,不但有大量的关于数字信号处 ...

  9. MATLAB——文件读写(1)

    1.文件打开关闭 (1)文件打开 fid=fopen(文件名,‘打开方式’)说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功.文件名用字符串形式,表示待打开的数据文件.常 ...

随机推荐

  1. iOS 正则表达式判断邮箱、身份证..是否正确

    //邮箱 + (BOOL) validateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Z ...

  2. HTML5 拖放

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 浏览器支持 I ...

  3. CocoaPods的使用(图文并茂)OS X 10.11 系统

    系统:OS X EI Capitan 版本:10.11.2 开发工具:XCode:7.2 要使用CocoaPods,那么就需要先安装哦,你安装了么?如果没安装那就请阅读我的前篇<OS X 10. ...

  4. 用C#实现RSS的生成和解析,支持RSS2.0和Atom格式

    RSS已经非常流行了,几乎所有有点名气的和没名气的网站都有提供RSS服务. 本文详细教你什么是RSS,如是在.Net中使用RSS. 1.那么什么是RSS呢? RSS是一种消息来源格式规范,用以发布经常 ...

  5. linux 同步IO: sync msync、fsync、fdatasync与 fflush

    最近阅读leveldb源码,作为一个保证可靠性的kv数据库其数据与磁盘的交互可谓是极其关键,其中涉及到了不少内存和磁盘同步的操作和策略.为了加深理解,从网上整理了linux池畔同步IO相关的函数,这里 ...

  6. linux下使用正确的用户名密码,本地无法连接mysql

    问题现象: Linux系统为CentOS 7.0 64位,通过IP远程mysql时,可以正常访问,确定账号密码没有问题.但是本地连接mysql时,提示ERROR 1045 (28000): Acces ...

  7. 如何在Java Filter 中注入 Service

    在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implements Filter ...

  8. Java NIO入门(二):缓冲区内部细节

    Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...

  9. 在Eclipse中安装SVN客户端插件

    在Eclipse中安装SVN客户端插件 1.1  Eclipse插件应用市场 在Eclipse中访问Eclipse Marketplace Client可以搜索Subversion,下载插件,按提示安 ...

  10. IE6-9中tbody的innerHTML不能赋值bug

    IE6-IE9中tbody的innerHTML不能赋值,重现代码如下 <!DOCTYPE html> <html> <head> <meta charset= ...