如何在Python,C或Java中读取部分大数据文件?

时间:2014-09-20 07:00:43

标签: java python c file binary-data

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)。

非常欢迎与代码效率相关的建议。

1 个答案:

答案 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 资料来源:我生锈的汇总任务。