Какой самый быстрый способ прочитать первые N символов строки в большом файле? - PullRequest
1 голос
/ 05 апреля 2011

например. у вас есть файл с 3 строками длиной в миллионы символов. Какой самый быстрый / самый эффективный способ прочитать первые N символов строки 2?

Ответы [ 5 ]

3 голосов
/ 05 апреля 2011

Либо у вас есть представление о том, где могут быть разрывы строк ...

  • строки одинаково длинные, поэтому разделите размер файла на три и ищите по этому адресу
  • длинна только одной строки, но вы не уверены, какую именно, поэтому прочитайте фрагмент из начала и конца файла и определите, какая это строка

... или вы находитесь в полной темноте, и вам нужно просто просмотреть свой путь, пока не найдете первую новую строку:

  • использовать отображение ввода-вывода в памяти для максимально возможной скорости сканирования, И
  • сообщает операционной системе (если она позволяет вам), что вы выполняете последовательное чтение, чтобы она не заполняла свой кэш данными файлов, которые вы сканировали, и больше не понадобится (например, в Linux, используйте madvise() - http://linux.die.net/man/2/madvise)
3 голосов
/ 05 апреля 2011

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

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

Джоэл написал сообщение в блоге по теме.

2 голосов
/ 05 апреля 2011

Использование ifstream::ignore().

#include <iostream>
#include <fstream>
#include <limits>

using namespace std;

int main(int, char* []) {
    ifstream file("file.txt");

    // skip first line
    file.ignore(numeric_limits<streamsize>::max(), '\n');

    // print next N characters
    const int N = 15;
    char s[N];
    file.get(s, N);
    cout << s << "\n";

    return 0;
}
1 голос
/ 05 апреля 2011

Я думаю, что искать и затем читать символ за символом - это хорошо, если вы знаете нижнюю границу своих строк, ищите эту границу и начинайте читать до следующей строки (для строки 2 из файла 3 строк).

1 голос
/ 05 апреля 2011

Сразу после прочтения всех символов строки 1?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...