с обработать большой файл - PullRequest
       17

с обработать большой файл

6 голосов
/ 11 сентября 2010

Мне нужно проанализировать файл, размер которого может быть много гигабайт. Я хотел бы сделать это на C. Может кто-нибудь предложить какие-либо методы для достижения этой цели?

Файл, который мне нужно открыть и проанализировать, - это дамп жесткого диска, который я получаю с жесткого диска моего компьютера Mac. Тем не менее, я планирую запустить свою программу в 64-битной Ubuntu 10.04. Также, учитывая большой размер файла, чем лучше оптимизирован метод, тем лучше.

Ответы [ 5 ]

4 голосов
/ 11 сентября 2010

И в * nix, и в Windows существуют расширения для процедур ввода-вывода, которые касаются размера файла, который будет поддерживать размеры, превышающие 2 ГБ или 4 ГБ.Естественно, базовая файловая система также должна поддерживать такой большой файл.В Windows NTFS делает, но FAT, например, нет.Это обычно называется «поддержкой больших файлов».

Две наиболее важные для этих целей подпрограммы - fseek() и ftell(), чтобы вы могли осуществлять произвольный доступ ко всему файлу.В противном случае обычные fopen() и fread() и друзья могут осуществлять последовательный доступ к файлу любого размера, если базовая ОС и реализация stdio поддерживают большие файлы.

1 голос
/ 12 сентября 2010

Определите макрос -D_FILE_OFFSET_BITS=64 или #define _FILE_OFFSET_BITS 64 для всех соответствующих источников (предпочтительно для всего проекта).Этот общий макрос предоставляется автоматически несколькими общими системами сборки.Затем используйте off_t (который теперь будет 64-разрядным) везде, где это требуется API.

1 голос
/ 11 сентября 2010

В дополнение к ответу Р.Бертайга и Мэтта:

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

Если все остальное терпит неудачу, используйте правильные типы C99, если вы делаете предположения о ширине типа. Использование int или long является почти всегда неправильно, их слишком много зависит от компилятора / платформы. Используйте int64_t (или int_fast64_t, если вы этого нет).

1 голос
/ 11 сентября 2010

Если вы работаете в 64-битной системе linux / bsd / mac / notwindows (а если серьезно, кто сейчас?), mmap работает очень хорошо. По сути, он позволяет отобразить весь файл в адресное пространство процесса и позволить ядру выполнять кэширование / разбиение по страницам за вас.

И если вы ДОЛЖНЫ использовать windows, здесь - та же концепция, но сделанная дружелюбными людьми из Редмонда. Обратите внимание, что для любого из них вам нужно будет работать в 64-битной системе, поскольку самый большой файл ABSOLUTE, который вы можете отобразить в 32-битной системе, составляет ~ 4 ГБ.

0 голосов
/ 11 сентября 2010

В зависимости от уровня Хомского может быть несколько бесплатных и коммерческих наборов инструментов для создания анализаторов для формата файла. Я думаю, что реальная проблема, с которой вы столкнулись, заключается в том, как обрабатывать несколько ГБ данных.

Хотите ли вы все данные в памяти одновременно?
Один из способов - записать части файла на диск во временные файлы, когда они не используются. Это можно сделать простым fread / fwrite из структуры, а некоторые умные подсчитанные по требованию загрузки и записи «по требованию» могут

...