java - 如何用Python、C或Java读取大数据文件的一部分?

标签 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 行和 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/

相关文章:

java - Java中的 "complete unit of execution"是什么?

java - 对学生姓名进行排序

python - 使用 Google App Engine 和搜索 API 进行邻近搜索

c - 这些代码行怎么会导致完全相同的程序有时崩溃但其他程序运行良好?

java - 大多数未打补丁的 Tomcat 网络服务器都容易受到攻击,谁的错?

java - Cosmos Db 回复消息长度错误使用 mongo java 驱动程序执行查找

python - 快速响应的命令行脚本

python - 检查 DataFrame 或 ndrray 是否包含数字

c - 如何从 gtk+2 中的输入法接收字符?

c - setuid 不适用于非 root 用户