2.6 GB,32位有符号整数的二进制文件,每行100个元素。
我可以在Java中逐行阅读:
DataInputStream dis = new DataInputStream(new FileInputStream("input.rawdata"))
for(int i = 0; i < 100; i++){
int idata = dis.readInt();
% DO THE NECESSARY TO LOAD idata IN A VARIABLE ARRAY %
}
dis.close();
但是如果我只想读取第505行而不读取最初的504行,那该怎么做呢?
或者,如果数据是100 x 1000矩阵并且希望只读取15到80行的矩形&amp; 100到200列。那么如何用以上三种语言中的任何一种来实现这一点(最好是Python和Java)。
非常欢迎与代码效率相关的建议。
答案 0 :(得分:0)
在C中,只要您知道文件的大小(以字节为单位),例如:
#define FILESIZE [file size in bytes]
#define NUMROWS [number of rows]
#define NUMCOLS [number of columns]
#define cnk_size(X,Y) (X*Y)
#define ENDROW [desired ending row]
#define SRTROW [desired starting row]
#define ENDCOL [desired ending col]
#define SRTCOL [desired starting col]
void* data = malloc(FILESIZE*sizeof(unsigned char));
fgets((char*)data,FILESIZE,stdin);
void* chunk = malloc(sizeof(unsigned char)*cnk_size(ENDROW-SRTROW,ENDCOL-SRTCOL));
register i = SRTROW;
register j = SRTCOL;
register datptr = (unsigned int)data;
register cnkptr = (unsigned int)cnkptr;
for(i = SRTROW; i < ENDROW; i++)
for(j = SRTCOL; j < ENDCOL; j++)
*((char*)cnkptr++) = *((char*)(datptr + i*NUMCOL + j));
在速度方面可能会删除for循环以进行优化,但是你的速度并不快,而java / python可能不会接近。 (最有可能是你的fgets()门控)。 将文件传递给程序:
bash -$$ .\your-program-name < your-file-name
如果您不想将整个文件加载到内存中,请查找拆分调用: https://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html 资料来源:我生锈的汇总任务。