Java 大文件子字符串提取,避免行终止符

Java 大文件子字符串提取,避免行终止符,java,newline,large-files,Java,Newline,Large Files,问题如下: 几个大文件(20+MB)中有DNA序列。我使用以下代码连接到这些文件: fc = FileChannel.open(file); // Create a read-only CharBuffer on the file ByteBuffer bbuf = fc.map(FileChannel.MapMode.READ_ONLY, 0, 256); CharBuffer cbuf = Charset.forName("8859_1").newDecoder().decode(bbuf

问题如下:

几个大文件(20+MB)中有DNA序列。我使用以下代码连接到这些文件:

fc = FileChannel.open(file);

// Create a read-only CharBuffer on the file
ByteBuffer bbuf = fc.map(FileChannel.MapMode.READ_ONLY, 0, 256);
CharBuffer cbuf = Charset.forName("8859_1").newDecoder().decode(bbuf);
我知道要提取的子序列的确切开始和结束位置,这将允许我使用该方法

cbuf.subSequence(start, end);
然而,大文件中的行终止符破坏了DNA序列,它们被视为一个字符。不建议假定文件中的行具有固定宽度。通过使用Charbuffer或类似的方法,什么是“跳过”行终止符的有效方法,同时保持内存效率


我曾尝试在正则表达式中使用贪婪量词,但行终止符再次破坏了结果。我想不惜一切代价避免加载整个文件内容。没有办法将换行符视为“不存在”吗?

您可以读取文件,找到行终止符并存储它们的位置

然后在提取时,您可以将不带终止符的位置转换为实际位置

为了更快地转换,您可以预先计算偏移量,然后只搜索正确的偏移量(O(长n),其中n是线路终止符的总数量,而O(m)中m是您实际需要跳过的终止符数量)


PS:如果可能的话,请考虑一下multichar(CR,LF)终止符。

DNA序列不是创建了一个“无数”(大量)字节的文件吗?如果不需要,也许应该避免加载整个文件?您的变量cbuf中似乎有一些数据(我不知道这是什么数据;您的代码没有说明)。我认为您可以编写一个函数来删除换行符,例如:

int index = 0;
for(int i = 0; i < cbuf.length; i++)
{
   if(!cbuf[i] != '\n' && cbuf[i] != '\r')
   {
      cbuf[index] = cbuf[i];
      index++; // will only increase if not linebreak
   }
}

int newcbufLength = index + 1;
int索引=0;
for(int i=0;i
此函数将使用原始数组,因此您不会有数据的新(大?)副本


(可能会有错误,因为我最习惯C语言而不是Java)

内存效率真的那么重要吗?20MB没有那么大。数据集总共有多大?这是C/C++还是您使用的语言?编程语言是Java。关于内存效率,文件处理只是我的程序必须完成的几个任务之一。如果加载整个文件,最好的策略是什么?删除所有“\n”分隔符对于我必须提取的序列数量来说似乎太少了。DNA序列不是创建了一个类似“无数”字节的文件吗?如果不需要,您可以避免加载整个文件吗?我已经应用了这个解决方案,它可能是最好的总体解决方案。提取信息的预处理步骤,用于在主搜索中加速序列提取。