Извлечение большой файловой подстроки, избегая ограничителей строки - PullRequest
0 голосов
/ 30 марта 2012

Проблема заключается в следующем:

Несколько больших файлов (более 20 МБ) содержат последовательности ДНК. Я использую следующий код для подключения к этим файлам:

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);

Однако, у больших файлов есть терминаторы строки, нарушающие последовательность ДНК, и они считаются символом. Не рекомендуется предполагать фиксированную ширину строк в файле. Какой эффективный способ «пропустить» терминаторы строки, но при этом сохранить эффективность использования памяти с помощью Charbuffer или чего-то подобного?

Я пытался использовать жадные квантификаторы с регулярными выражениями, но ограничители строки снова нарушают результат. Я хочу избежать загрузки содержимого файла в полном объеме любой ценой. Разве нельзя трактовать символы новой строки как «несуществующие»?

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Разве последовательности ДНК не создают файл, который походит на "zillion" (большое количество) байтов?Может быть, вам следует избегать загрузки всего файла, если он не нужен?Кажется, у вас есть некоторые данные (я не знаю, что это за данные; ваш код не сообщает) в вашей переменной 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;

Эта функция будет использовать исходный массив, поэтому у вас не будет новой (большой?) Копии данных.

(могут быть ошибки, так как я больше всего привык к C #, а не к Java)

0 голосов
/ 30 марта 2012

Вы можете прочитать файл, найти разделители строк и сохранить их положение.

Тогда при извлечении вы можете конвертировать позицию без терминаторов в реальную позицию.

Для более быстрого преобразования вы можете предварительно вычислить смещение, а затем просто искать правильное смещение (O (long n), где n - общее количество терминаторов строки по сравнению с O (m), где m - количество терминаторов, которые необходимо пропустить)

PS: подумайте о мультиканальных (CR, LF) терминаторах, если это может произойти.

...