g*********s 发帖数: 1782 | 1 在做IO优化。原来有大量fread操作,现在想精简成一次读到一个buffer里,从里面取
出data。有没有这样现成的库函数啊?
C++的binary stream应该可以把?但上次有个讨论说C++的binary stream比较慢?
原来的code:
for (int i = 0; i < count; i++) {
int x;
fread(&x, sizeof(int), 1, input_fp);
long y;
fread(&y, sizeof(long), 1, input_fp);
}
现在想改成:
void** buffer = new char[count];
fread(*buffer, sizeof(char), count, input_fp);
for (int i = 0; i < count; i++) {
int x;
bufferRead(&x, sizeof(int), 1, buffer);
long y;
bufferRead(&y, sizeof(long), 1, buffer) |
|
r****y 发帖数: 1437 | 2 This error message means that you did not open the file successfully at all.
Nothing to do with fread.
Moreover, c = fread(fid, 5) is wrong. You have to specify the data type, e.
g. fread(fid, 5, 'int'), to read 5 integers out.
I am not using matlab under windows. But I guess you can try to cd to that
directory first, then do fread. |
|
g*********s 发帖数: 1782 | 3 For example:
big endian machine,fwrite(&x, sizeof(int), 1, output).
small endian machine, fread(&y, sizeof(int), 1, input).
Here input and output point to the same file.
Will fread/write transparently handle this issue? |
|
w*******n 发帖数: 7 | 4 When I use fread , it always shows:
??? Error using ==> fread
Invalid file identifier -1.
I even tried some easy examples, the same warning came up.
What's wrong? Please help me:) |
|
l***i 发帖数: 1309 | 5 Here is one way to handle it.
#include
#include
#include
size_t write_uint32_to_file( FILE* file, uint32_t nbr )
{
nbr = htonl( nbr ); // Host to network long
return fwrite( file, &nbr, 4, 1 );
}
size_t read_uint32_from_file( FILE* file, uint32_t* nbr )
{
size_t res = fread( file, nbr, 4, 1 );
*nbr = ntohl( *nbr ); // Network to host long
return res;
} |
|
|
g*********s 发帖数: 1782 | 7 但是如果count是个很大的数字,fread会call很多次。
当然,我现在还不清楚这样是不是能省下开销来。想试试。 |
|
g*********s 发帖数: 1782 | 8 profile过了。看到fread开销不小才想这么做的。
也许是必须的开销,但不试试怎么知道。 |
|
g*********s 发帖数: 1782 | 9 I did a test and posted the result just yesterday.
Basically, if you use customized buffer, you can save time by another 10%
than default fread buffer. |
|
C***S 发帖数: 175 | 10 here is what I done, no problem on this.
EDU>> fid=fopen('single.txt','rt');
EDU>> s=fread(fid,5);
EDU>> sc=char(s)
sc =
a
b
c
d
e
occurred |
|
H***a 发帖数: 735 | 11 我用下面这段code读的,请指教,谢谢!
for procID=0:(numProcs-1)
fileName = sprintf('%d-DATA.dat', procID);
data = fopen(fileName, 'r');
if data ~= -1
numFreqs = fread(data, 1, 'long');
numLocations = fread(data, 1, 'long');
for m=1:numLocations
x = fread(data, 1, 'long') + 1;
y = fread(data, 1, 'long') + 1;
z = fread(data, 1, 'long') + 1;
for w=1:numFreqs
re = fread(data, 1, 'double');
|
|
t****t 发帖数: 6806 | 12 嗯, 这回我看明白了
可以这样写
for procID=0:(numProcs-1)
fileName = sprintf('%d-DATA.dat', procID);
data = fopen(fileName, 'r');
if data ~= -1
numFreqs = fread(data, 1, 'long');
numLocations = fread(data, 1, 'long');
pos=ftell(data);
xyz=fread(data, [3 numLocations], "3*long", numFreqs*3*2*8)+1;
fseek(data, pos+3*4, -1);
dataformat=sprintf('%d*double', 2*3*numfreqs);
Exyz=fread(data, [2 3*numfreqs*numLocations], dataformat, 3*4);
Exyz=complex(Exyz(1,:), Exyz(2,:));
Exyz=reshape(Exyz, [numFreqs 3 numLocations] |
|
S*****y 发帖数: 567 | 13 希望有个大虾能给解释下。
版本是2.6.32-71.el6.x86_64
发现读取文件后,free mem大幅下降。文件很大,10几G的样子
total used free shared buffers cached
Mem: 32091 24459 7632 0 7 23250
-/+ buffers/cache: 1200 30891
Swap: 34271 21 34250
就是这里free/Mem那一格
网上查了说看是否内存泄漏应该看swap?
我有一个程序,读取文件。
如果我手动清理掉used Mem
echo 3 > /proc/sys/vm/drop_caches
然后跑一次那个程序。就会看到大概10个G的内存被用了,没有释放(文件大小差不多)
然后速度是1分钟。
然后在不释放那些内存的情况下,再跑n次,每次都是10秒钟。包括读取另外一个差不
多大小的文件,也是10秒钟的... 阅读全帖 |
|
t****t 发帖数: 6806 | 14 把你的内循环
for w=1:numFreqs
re = fread(data, 1, 'double');
im = fread(data, 1, 'double');
%Ey(x,y,z,w) = complex(re, im);
Ey_re(x,y,z,w) = re;
Ey_im(x,y,z,w) = im;
end
变成
A=fread(data, [2 numFreqs], 'double');
Ex_re(x,y,z,1:numFreqs)=A(1,:);
Ex_im(x,y,z,1:numFreqs)=A(2,:);
我没看明白你的程序, 你把内循环写三遍是啥意思? |
|
S*****y 发帖数: 567 | 15 【 以下文字转载自 Linux 讨论区 】
发信人: Schummy (QQ), 信区: Linux
标 题: 新人5个包子请教问题,redhat读写文件的内存问题
发信站: BBS 未名空间站 (Tue Apr 10 18:18:18 2012, 美东)
希望有个大虾能给解释下。
版本是2.6.32-71.el6.x86_64
发现读取文件后,free mem大幅下降。文件很大,10几G的样子
total used free shared buffers cached
Mem: 32091 24459 7632 0 7 23250
-/+ buffers/cache: 1200 30891
Swap: 34271 21 34250
就是这里free/Mem那一格
网上查了说看是否内存泄漏应该看swap?
我有一个程序,读取文件。
如果我手动清理掉used Mem
echo 3 > ... 阅读全帖 |
|
d****n 发帖数: 1637 | 16 I wonder how the below code break the loop.
if lenHost is signed number it could be a problem for fread.
fread convert it to a unsigned large number and read the huge block at one
shot.
check if lenHost defined correctly as size_t or the limits.
while(readed==1){
lenHost = rip_ntohs(lenNet);
fread(buffer, lenHost, 1, fp);
} |
|
c*******g 发帖数: 475 | 17 搞定
clc
filename='c:\Documents and Settings\User Name\My Documents\Spectral File.SPA
';
fid=fopen(filename,'r');
% Find the points number
fseek(fid,hex2dec('234'),'bof');
Number_of_DataPoints=fread(fid,1,'int32');
%Find the maximum and minimum of Wavenumber (cm-1) range
fseek(fid,576,'bof');
Maximum_Wavenumber=fread(fid,1,'single');
Minimum_Wavenumber=fread(fid,1,'single');
Interval=(Maximum_Wavenumber-Minimum_Wavenumber)/(Number_of_DataPoints-1);
Wavenumber=linspace(Minimum_Wavenumber,Maximum_Wa |
|
c*******g 发帖数: 475 | 18 我把程序修改了一下
现在应该好用了, 至少读数据应该没问题了
%reverse engineering *.spa
clc
filename='c:\Documents and Settings\user
\My Documents\051109 sample B.SP
A';
fid=fopen(filename,'r');
% Find the points number
fseek(fid,hex2dec('234'),'bof');
Number_of_DataPoints=fread(fid,1,'int32');
%Find the maximum and minimum of Wavenumber (cm-1) range
fseek(fid,576,'bof');
Maximum_Wavenumber=fread(fid,1,'single');
Minimum_Wavenumber=fread(fid,1,'single');
Interval=(Maximum_Wavenumber-Minimum_Wavenumber)/(Number_of_DataPoints- |
|
s********k 发帖数: 6180 | 19 fread和mmap哪个效率高?另外fread的话size是整个binary file,还是分次一点点读? |
|
b**********5 发帖数: 7881 | 20 这年头, 问题问的千变万化的。 这家用C做ad targeting。
1) 问我一个coding test应该怎么improve。 其实就是要写read, 我用了fread。
问我fread和read什么区别。 我这C都不知什么时候用的了, 早忘了
2) 然后再问, what happens when u use new/malloc. 其实是要问unix/windows
system command that allocates memory, like brk..
3) 然后问, 比如一个integer array, 32 elements, 32 threads running on 32
processors, i find a lot of idle cpu time. why?
其实就是问什么是false sharing. 听都没听说过。 问到了L1, L2 cache... |
|
s***e 发帖数: 122 | 21 看来是因为这一句:
fread(&sacbin, sizeof(header), 1, fpr);
要改成
fread(&sacbin, sizeof(struct header), 1, fpr);
如果你是用C编译器的话。
当然你也可以定义struct header为typedef struct header {...} HEADER; 那样你就可以用sizeof(HEADER)了。
下面这段代码是可以编译运行的。
#include
struct header {
int hd;
};
struct sac
{
struct header hdr;
float * data;
};
void test2() {
const char * const fn = "test2.txt";
FILE* fpw = fopen(fn, "w");
struct header hdr;
hdr.hd = 18;
fwrite(&hdr, sizeof(hdr), 1, fpw);
fclose(fpw |
|
z****u 发帖数: 185 | 22 【 以下文字转载自 Linux 讨论区 】
发信人: zouzou (zouzou), 信区: Linux
标 题: a linux disk IO question
发信站: BBS 未名空间站 (Tue Jul 29 02:11:58 2008)
I need to reorganize a large amount of data (~9.5G, 500 files) stored in
disk.
So I do
foreach( file )
{
fread( file );
reorganize;
fwrite( file );
};
What surprises me is that it takes too long to do this simple thing. One
timing result shows
read: 4761second (time cost for fread)
|
|
H***a 发帖数: 735 | 23 感谢thrust提供的优化,感谢kkff在“Matlab处理数组一问”这贴中回复教了俺
sub2ind这个无比好用的函数,现在程序优化如下。
测试结果:耗时8秒。非常赞!
Ex = zeros(numFreqs,sizeX,sizeY,sizeZ);
Ey = zeros(numFreqs,sizeX,sizeY,sizeZ);
Ez = zeros(numFreqs,sizeX,sizeY,sizeZ);
for procID=0:(numProcs-1)
fileName = sprintf('%d-NearFieldDFT.dat', procID);
data = fopen(fileName, 'r');
if data ~= -1
numPoints = fread(data, 3, 'int');
totNumPoints = numPoints(1)*numPoints(2)*numPoints(3);
xyz=fread(data,[3 totNumPoints],'int |
|
x******a 发帖数: 6336 | 24 I got thousands problems on the following piece of code "dumpfile.h" when I
compile under cygwin. it is ok under visual stduio... can anyone help?
Thanks!
#include
#include
#include //ostream_iterator
#include //cerr
#include //std::copy
template
void dump_to_file(const char* filename, const std::vector& v_d){
std::ofstream ofs(filename);
if(!ofs){
std::cerr<<"Unable to open the file to write!n";
return ;... 阅读全帖 |
|
w********i 发帖数: 389 | 25 老兄,
我试了试,7million columns, 700 rows,
依然报错如下,
> fread("Desktop/genes.list.3", skip=1)
Error in fread("Desktop/genes.list.3", skip = 1) :
Not positioned correctly after testing format of header row. ch=' '
sep 是用 't'.
请指点 |
|
l****i 发帖数: 398 | 26 用data.table下的fread函数。我读过一个5g多的数据,才2:30秒。对data.table的读
取速度比较满意。
system.time(DT <- fread("201403-201406_with_tv_market.csv"))
Read 16221666 rows and 29 (of 29) columns from 5.380 GB file in 00:02:30
user system elapsed
137.17 3.48 149.70 |
|
l***h 发帖数: 392 | 27 这个题目主要是靠第二点和第三点。
#include
#include
#define BLOCK 40
size_t readblock(FILE *fp, char* buffer){
return fread(buffer,1,BLOCK,fp);
};
size_t readline(FILE *fp, char *buf){
long pos = ftell(fp); // record the currently position
int offset = 0;
int num;
while( num = readblock(fp, buf+offset)){
int i;
for( i=0; i
char c = buf[offset];
if(... 阅读全帖 |
|
s********k 发帖数: 6180 | 28 用什么最好?fread,fseek或者先用mmap?如果内存一下装不下,怎么能分段读?
谢谢 |
|
w***g 发帖数: 5958 | 29 1B 32-bit interger也就4G, 怎么读都差不多, 应该能一次读进来。建议用fread,最
portable。 |
|
d****n 发帖数: 1637 | 30 fread 就行了,400G也就几分钟。
你考虑的是速度也不是内存,不用搞那么复杂。 |
|
s********k 发帖数: 6180 | 31 400G怎么装进内存?或者fread内部是怎么工作的呢?一次装不下怎么弄? |
|
s***e 发帖数: 403 | 32 还有一个比较烂的方法
将文件倒着用fseek和fread一个byte一个byte的读到buffer里面
读到\n或者文件头的时候就输出buffer |
|
n*******k 发帖数: 100 | 33 就老老实实的取2个文件f1,f2(比如整数)的头元素放在变量v1,v2里面,较小的值
写入磁盘结果文件,(判断读完与否,feof() )
while(f1未读完且f2也未读完)
如果v1 <= v2, fwrite(&v1,4Byte,1,res_file),从f1读取下一个数;
否则fwrite(&v2,4Byte,1,res_file),从f2读取下一个数。
if (f1读完,f2没被读完)
flush f2剩余元素进入res_file
if (f2读完,f1没被读完)
flush f1剩余元素进入res_file
这样不就行了吗?
fread/fwrite可以利用文件缓冲区。如果自己想偷懒,不想切文件,定义和管理文件缓
冲区,直
接这样用就可以了。出来的文件就是globally sorted。 |
|
l****u 发帖数: 4594 | 34 直接c++编程读,v6版的mat,前192个是head,后面直接fread(); |
|
d*****0 发帖数: 1500 | 35
太抬举了
我是野路子,如果是想简单的把这个数据输入静态内存数组的话,用while循环,逐行
fread加上strchr去找空格和回车符,然后逐个填进去就行了。 文件操作的c代码网上
大把大把的。即使是生手,也用不了半天就能搞定。 |
|
y***u 发帖数: 5243 | 36 printf,fread,fwrite在哪个平台是不一样的? |
|
y***u 发帖数: 5243 | 37 EE毕业,做信号处理,虽然主要做软件。我是说,一个代码里面,只包含printf,fread
,fwrite我需要写什么平台相关代码?我只做信号处理 |
|
s****c 发帖数: 11300 | 38 你不觉得奇怪么 你同一个printf 可以输出到电脑屏幕上 也可以输出到串口里面 也可
以输出到文件里面
stdio.h里面要是没有硬件信息 你的程序往哪里输出?
fread |
|
z*y 发帖数: 1311 | 39 Thanks, but not work very well.
I use C.
Here is the code I generate data.
FILE *f_out = fopen("LL.dat", "wb");
fwrite(LL, sizeof(short int), 256*256, f_out);
fclose(f_out);
Then I try Matlab.
f = fopen('LL.dat', 'rb');
d = fread(f, [256,256], 'int16');
imwrite(d, 'LL.jpg', 'jpg', 'BitDepth', 16, 'Mode', 'lossless');
imwrite(d, 'LL.png', 'png', 'BitDepth', 16);
The image is not right. BTW, data LL is correct.
I verify using other ways.
Thank you for the help. |
|
n*p 发帖数: 298 | 40 我是在用fread读一个文本文件到buffer里,
然后用strtok(file_buffer,DELIMITERS)来parse,
这个文本文件只有10个字符,两个单词
可parse之后总是会多几个怪字符怎么办?
好像strtok没看到buffer(也就是file)的end |
|
m*t 发帖数: 7490 | 41 (编程问题,这个版人多,问问)
原来有一些数据存档文件,是二进制文件,32位系统写的 (1 float=4 bytes, 1
double=8 bytes)
现在源程序在64位系统重新编译了,但是还想调这些数据,请问有什么方法能够不改源
程序就读(fread)的?多谢 |
|
m*t 发帖数: 7490 | 42 你确定
同一句语句 fread(buffer,1,sizeof(float),fp)
在32位和64位下读入字窜的长度相等?我怎么觉得一个读了4byte,一个读了8byte
还有,我用的是linux,不知道会不会有差别? |
|
d***a 发帖数: 13752 | 43 可以自己写一个简单的file system cache程序。比如说用C编程,应用程序用fread()
读数据,那就自己写一个myfread()代码,内嵌cache算法,用内存或local SSD来做
cache。这个做起来不算复杂。
如果NAS上的数据是很多小文件,也可以改fopen()变成myfopen():检查要打开的文件有
没有local备份。如果没有,从NAS远端拷贝到local SSD或内存虚拟盘。这样做更简单
些,不过要求数据按小文件组织。 |
|
s********k 发帖数: 6180 | 44 【 以下文字转载自 JobHunting 讨论区 】
发信人: silverhawk (silverhawk), 信区: JobHunting
标 题: linux怎么读入一个超过有超过1B integer的binary file?
发信站: BBS 未名空间站 (Fri Oct 26 10:40:33 2012, 美东)
用什么最好?fread,fseek或者先用mmap?如果内存一下装不下,怎么能分段读?
谢谢 |
|
|
S****t 发帖数: 1186 | 46 thanks a lot! this makes sense. i have a further question.
since the file i am reading has a fixed header length of 100.
can i still use
fread(&shapeFileHeader, sizeof(shapeFileHeader), 1, fpShapeFile)
to read the header into the header structure or I need to read the fields (
like
Shape, Xmin, etc) one by one to address the disparity? Thanks again! |
|
l***e 发帖数: 480 | 47 PPM的图形文件,P3字符格式和P6二进制格式。
怎么读?
对二进制格式,GETC读不进来。FREAD读到数组里,好象也不对。不知为何。
字符格式每行三个数字字符,以空格分隔:XXX XXX XXX
FSCANF转换好象有问题。
哪位有经验,介绍一点。多谢 |
|
l*****d 发帖数: 754 | 48 It is not supposed to be human-readable. You can try to read it by using
fread. |
|
y****e 发帖数: 23939 | 49 我还是贴code吧:
unsigned int seed;
FILE * devrandom;
if((devrandom = fopen("/dev/random", "r")) != NULL) {
fread(&seed, sizeof(seed), 1, devrandom);
fclose(devrandom);
} |
|