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 行和 100 到 200 列的矩形。那么如何用上述三种语言(最好是Python和Java)来实现这一点。
非常欢迎与代码效率相关的建议。
最佳答案
在 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 来源:我生锈的池作业。
关于java - 如何用Python、C或Java读取大数据文件的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25946168/