有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 50+GB分隔文件中的大致行数

我需要通过检查文件中的行数是否与附加到尾部的行数(大约)匹配来验证相当大的分隔文件

有几种方法,我不接受:

-将整个文件放入堆中

-在验证步骤完成之前,不会开始处理

到目前为止,我所拥有的:

我跟踪并解析预告片以获得行数,这非常有效

我计划做的是: 从一个文件中获取0,5/1mb的行样本(理想情况下是随机的),对其中的行进行计数并相应地相乘,以获得整个文件中行的近似值

我不想把自己局限于通过先读取“n”行数,然后检查其大小来创建示例

问题:

有没有可能在不读取整个文件的情况下获得这样的样本?我是否可以从文件中间开始提取n行,而不重新创建原始文件的一部分(例如head '-c/n' 'x' file.csv > file1.csv效率不高)


共 (2) 个答案

  1. # 1 楼答案

    Is it possible to get a sample like that, without reading whole file?

    Can I start fetching n number of rows starting from the middle of the file, without recreating part of the original file ..

    • 使用File.length()获取文件的长度
    • 使用FileInputStream打开文件
    • 使用FileInputStream.skip(N)跳到要采样的偏移量。(我已经检查了Java8源代码,skip是有效的。它使用lseek系统调用而不是读取字节…)
    • 最后,将流包装在BufferedReader(InputStreamReader)中,并使用BufferedReader.readLine()来计算M行并测量它们的平均长度

    退一步说,我对问题本身有两点看法:

    I need to validate quite large delimited file by checking if the number of rows within the file, matches(approximately) number appended to the trailer.

    1. 不清楚近似匹配是否有多大帮助。我想,这取决于您试图检测的故障模式

    2. 您不希望大多数/所有输入文件的平均记录都相同吗?如果是这样的话,根据文件大小x预期的平均记录数验证行数(来自尾部)可能更有意义

    3. 当一小部分记录不好时,抽样不会发现问题。这种不好可能是空行或多个/大部分/所有字段为空的记录

    还有一个问题是,对这么大的文件进行单独的“快速”验证是否是一个好主意。如果你发现了问题,你能做什么?你去拿吗?重新发送?做一个完整的验证不是更好吗。。。当你处理它的时候?把文件缩小不是更好吗?对于这种大小的文件,选择比CSV更紧凑的表示形式不是更好吗

  2. # 2 楼答案

    如果文件大小为50GB,将整个文件放入堆中可能不是一个好主意

    您可以使用内存映射文件,例如,它允许您读取整个文件,而无需将其完整地装入主内存中

    您可以使用RandomAccessFile和MappedByteBuffer打开 作为内存映射缓冲区的文件区域。 请查看RandomAccessFile。getChannel和FileChannel。映射方法