2013-08-16 4 views
0

У меня есть огромный разделенный запятыми файл (1,5 Gb) и хочу, чтобы прочитать одну конкретную строку из файла в R.Чтение определенной строки из огромного файла * быстро *

Я видел (много) версии этого вопроса во много раз, и все это говорит что-то вроде

con = file(fileName) 
open(con) 
scan(con, what=list("character", "character"), skip=1000000, nlines=1, sep="\t", quiet=TRUE) 

это работает, но это по-прежнему крайне медленно - мы говорим от 20 до 30 секунд, чтобы прочитать одну строку!

Есть ли более быстрый способ? Разумеется, должен быть быстрый способ прыгнуть на определенную линию ...

Спасибо, миллион!

+0

Для этого вы можете использовать 'data.table'! – Metrics

+3

http://stackoverflow.com/questions/18235269/efficiently-reading-specific-lines-from-large-files-into-r – Peyton

ответ

0

Вы знаете что-либо еще о структуре вашего файла?

Если каждая строка/строка имеет точно такое же количество байтов, вы можете вычислить количество байтов и seek в начале строки.

Однако, если количество байт на строку не совсем одинаково для каждой строки, тогда вам нужно прочитать каждый символ, проверьте, является ли это новой линией (или другим возвратом каретки, или обоими), и подсчитайте их для поиска линию, которую вы ищете. Это то, что skip аргумент scan и его друзья.

Могут быть другие инструменты, которые быстрее выполняют чтение и подсчет, которые вы могли бы предварительно обработать ваш файл и вернуть только интересующую строку.

Если вы собираетесь делать что-то подобное несколько раз, это может ускорить общий процесс, чтобы прочитать файл в другой структуре, такой как база данных, которая может напрямую обращаться к произвольным строкам или предварительно индексировать строки так что вы можете seek непосредственно в соответствующую строку.

+0

Большое спасибо за ответ - очень полезно. По звуку того, что вы говорите, «предварительная индексация строк, чтобы я мог« искать »прямо в соответствующей строке» звучит точно так же, как я хочу. Единственная проблема заключается в том, что мой файл находится в системе Windows, и в документации запрещается использование Seek в таких системах. В этом случае маршрут базы данных может быть более уместным - можете ли вы предложить какие-либо ссылки на то, как я могу хранить этот файл в виде базы данных? – user1353889

+1

@ user1353889, пакет 'sqldf' имеет функцию' read.csv.sql'. Я считаю, что в некоторых других пакетах базы данных есть аналогичные функции. –

+0

Большое спасибо - исследуем. И ради того, чтобы другие читали вопрос в будущем, не могли бы вы также кратко поговорить с тем, как можно предварительно проиндексировать строки для использования с поиском, как вы описали? – user1353889

Смежные вопросы