最近在分析一个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. jdbc mysql crud dao模型 sql注入漏洞 jdbc 操作大文件

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

  2. (转载)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/ ...

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

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

  4. java filechannel大文件的读写

    java读取大文件 超大文件的几种方法 转自:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/   java 读取一个 ...

  5. Mac技巧之让U盘、移动硬盘在苹果电脑和Windows PC都能识别/读写,且支持4GB大文件:exFAT格式

    如果您的 U 盘.移动硬盘既要用于 PC 又要用于苹果电脑,Mac OS X 系统的 HFS+ 和 Windows 的 NTFS 格式显然都不行……HFS+ 在 Windows 下不识别,NTFS 格 ...

  6. 那些年,坑死自己的事之fread/fwrite

    今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...

  7. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

  8. 文件读写IO

    摘要:本文主要总结了以下有关文件读写的IO,系统调用与库函数. 1.初级IO函数:close,creat,lseek,open,write 文件描述符是一个整型数 1.1close 1.2int cr ...

  9. C文件读写

    0. 文件操作相关函数 1.  文件分为字符方式读写,字节方式(二进制方式)读写 fprintf / fscanf FILE * file; //全局定义 void save(Book books[] ...

随机推荐

  1. 架构师养成记--10.master-worker模式

    master-worker模式是一种并行计算模式,分为master进程和worker进程两个部分,master是担任总管角色,worker才是执行具体任务的地方. 总体流程应该是这样的: 具体一点,代 ...

  2. RecyclerView item 状态错乱

    adapter中: private List<Integer> checkboxUserIdList = new ArrayList<>(); 在如下这个方法中: public ...

  3. CSRF 攻击

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  4. 《利用python进行数据分析》读书笔记--第五章 pandas入门

    http://www.cnblogs.com/batteryhp/p/5006274.html pandas是本书后续内容的首选库.pandas可以满足以下需求: 具备按轴自动或显式数据对齐功能的数据 ...

  5. windows 批处理把所有java源码导入一个txt文件中

    首先在src下搜*.java,把搜到的文件全拷出来放在allsrc目录下, 然后在allsrc目录下建个run.bat,键入以下内容for %%i in (*.java)  do type %%i&g ...

  6. MYSQL主键自动增加的配置及auto_increment注意事项

    文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二:   点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字 ...

  7. SAP 预制发票时扣除已预制的数据

    INCLUDE程序: LMR1MF6S 最后增强: ENHANCEMENT ZMIR7_01. "active version DATA:LS_YDRSEG LIKE LINE OF YDR ...

  8. Swing——JFrame

    1.定义 相对于AWT(hevay weight component),Swing(hevay weight component)是轻量化的组件.Swing由纯Java Code 所写,解决了Java ...

  9. Maven最佳实践:版本管理

    什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...

  10. 【HDOJ】2699 Five in a Row

    wa了几次,至少要考虑4个方向:下.右.左下.右下.很像当年北航的机试题目. /* 2699 */ #include <iostream> #include <cstdio> ...