【问题标题】:How to read part of big datafile in Python, C or Java?如何在 Python、C 或 Java 中读取部分大数据文件?
【发布时间】:2014-09-20 07:00:43
【问题描述】:

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)中的任何一种来实现这一点。

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

【问题讨论】:

  • 我猜你想要 MMAP?
  • 阅读fseek() 并从那里获取。
  • 二进制文件中的一行是什么意思?
  • 谢谢@NPE & vaultah。函数 seek(file_pointer_location) 正是我想要的;一些我是如何错过在 CS-101 课程作业中学习此功能的。而且 MMAAP 看起来是一种更聪明的方法,我有时肯定会尝试一下。
  • @KlasLindbäck 这实际上是一次雷达采集的数据,这里的线是沿距离方向的像素。数据是一种你可以说的图像文件。当您从商业供应商处获取数据时,他会为您提供一个带有适当内置标题和适当分隔符的文件。不像在雷达采集的情况下,波特率是至关重要的,我们不能奢侈地在记录时添加分隔符。这就是为什么我们将日志记录为二进制文件(我猜这会节省一些内存和处理负载),然后在我们的文件处理过程中,我们将这些行与这些 GB 长的二进制字符串分开。

标签: java python c file binary-data


【解决方案1】:

在 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 来源:我生锈的池化作业。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2016-04-17
    • 1970-01-01
    • 2021-01-06
    • 2015-06-02
    相关资源
    最近更新 更多