最近在分析一个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支付宝集成时遇到的问题整理(2)

    1.集成支付宝SDK编译报错#include<openssl/asn1.h>这一行  “openssl/asn1.h”file not found 解决方法:在BuildSetting 里 ...

  2. Visual Studio发布Web项目报错:Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The specified file could not be encrypted.

    背景 Visual Studio下的Web项目 现象 发布时遇到Unable to add 'xxx' to the Web site.  Unable to add file 'xxx'. The ...

  3. CentOS下搭建SVN服务器

    1.安装SVN SVN数据存储有两种方式,BDB(事务安全表类型)和FSFS(一种不需要数据库的存储系统),为了避免在服务器连接中断时锁住数据,FSFS是一种更安全也更多人使用的方式.SVN的运行方式 ...

  4. java控制台输入

    一.java控制台输入 java控制台输入有如下几个方法 1.JDK 1.4 及以下版本读取的方法 JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的 ...

  5. python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

    s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() ...

  6. Hive DDL DML SQL操作

    工作中经常要用到的一些东西,一直没整理,用的多的记住了,用的不多的每次都是去查,所以记录一下. DDL(数据定义语言),那就包括建表,修改表结构等等了 建表:create hive table hiv ...

  7. Canvas修行之黑客帝国代码雨

    既然是修行,不卖弄关子,不吊胃口,修行成果必须先晒一晒. 下图是我用canvas画的黑客帝国代码雨,想起当年看黑客帝国时,那个代码雨场景让我心旷神怡,大开脑洞,满脑子是那种三维空间,无数0和1像雨一样 ...

  8. Codeforces Round #257(Div.2) D Jzzhu and Cities --SPFA

    题意:n个城市,中间有m条道路(双向),再给出k条铁路,铁路直接从点1到点v,现在要拆掉一些铁路,在保证不影响每个点的最短距离(距离1)不变的情况下,问最多能删除多少条铁路 分析:先求一次最短路,铁路 ...

  9. org.springframework.web.context.ContextLoaderListen 报错解决办法

    今天搭建SSH项目的时候出现了如下错误: 严重: Error configuring application listener of class org.springframework.web.con ...

  10. Java后端实现图片压缩技术

    今天来说说图片压缩技术,为什么要使用图片压缩,图片上传不就完事了吗?对的,这在几年前可以这么说,因为几年前还没有现在这么大的并发,也没有现在这么关注性能. 如今手机很多,很多人都是通过手机访问网络或者 ...