0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 8
|
||||||
1 | ||||||
Подсчет строк в гигантском текстовом файле > 4 Гб19.02.2013, 01:25. Показов 1756. Ответов 8
Метки нет (Все метки)
Всем привет, я новичок в С++, но очень стараюсь. Прочитал Дейтелов и теперь хочу сделать что-то практическое и полезное.
Сам занимаюсь этическим хакингом , есть небольшая практическая цель - написать прогу, которая бы обьединяла N текстовых файлов - словарей для брутфорса в один гигантский, при этом бы сортировала слова и удаляла повторяющиеся. И при этом бы не жрала память. Начало было положено с написания кода, который выполнял подсчет строк в файле с помощью std::getline(), но к сожалению гетлайн не подходит для работы с большими файлами, и считает долго. Гигантский файл в память не загрузишь. Второй итерацией был написан код, представленный чуть ниже, в нем использовал принцим File memory mapping. И чтение файла ведется порциями по 1 МБ. Написано в VS2012 С++. Все работает чудесно, но уперся в ограничение 32 битов unsigned long.... обрабатывает файлы до 4 гб. А у меня на винте лежит словарик в 24 Гб....хотелось бы его посчитать. Подскажите ответ на 2 вопроса: 1) можно ли побороть проблемму на 32 битной системе 2) куда копать чтобы реализовать на 64 битах? Реально первая прога, которую написал не по учебнику, был бы также рад услышать конструктивную критику если заметите признаки говнокода. Код:
0
|
19.02.2013, 01:25 | |
Ответы с готовыми решениями:
8
Подсчет количества строк в текстовом файле Подсчёт количества строк в текстовом файле Подсчет количества строк в текстовом файле, имя которого задано первым параметром КФ. Проверить наличие указа Подсчёт букв в текстовом файле |
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
19.02.2013, 04:33 | 2 |
Есть ведь 64 битный тип long long int в новом стандарте. Так же есть тип std::size_t, который в 64 битной программе так же 64 битный.
0
|
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
|
|
19.02.2013, 09:07 | 3 |
Нужно двигать отображение. Смапил кусок, обработал, анмап. Смапил следующий кусок, обработал, анмап. И не нужно закрывать хэндл FileMappingObject'a каждую итерацию и создавать снова для одного и того же файла.
1
|
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 8
|
||||||
19.02.2013, 14:10 [ТС] | 4 | |||||
Про хендл понял, вынесу за цикл, спасибо.
А вот с остальным как-то не очень.В мануалах и примерах не нашел пример использования... уж не забросайте помидорами. Я не совсем понимаю как игратся с єтими // size of mapping object, high // size of mapping object, low // high-order 32 bits of file offset // low-order 32 bits of file offset Какие мне DWORD значения в 32 битном приложении нужно подставить чтобы прочитать из файла размером > 40GB Скажем, начиная с офсета в 42 949 672 960 B байта (40Gb) до 42 950 721 536 байта (40Gb + 1 Mb).
0
|
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 8
|
|
19.02.2013, 16:30 [ТС] | 6 |
Ответ не до конца понятен.
CreateFileMapping и MapViewOfFile принимают значения DWORD. (typedef unsigded long DWORD)....32 бита на сколько я понимаю. Разве я могу скармливать им long long? Или мне нужно дополнительно какой-то функцией распарсить побитно long long на два DWORDа и скармливать отдельно старшую и младшую часть? Тоесть применимо к моему вопросу будет ли работатьзначения подставленные ниже? Есть ли вобще смысл заморачиватся и высчитывать CreateFileMapping размеры, я так понимаю можно подставить нули и смапится тогда весь файл. Ведь эта функция не жрет память? CreateFileMapping // 0 // size of mapping object, high 0 // size of mapping object, low MapViewOfFile 10 // high-order 32 bits of file offset 0000 0000 0000 0000 0000 0000 0000 1010 0 // low-order 32 bits of file offset 0000 0000 0000 0000 0000 0000 0000 0000 1048576// number of bytes to map (1 MB) Добавлено через 8 минут А как получить размер большого файла для 32 бит приложения, или мне неменуемо нужно переезджать на 64?
0
|
836 / 343 / 67
Регистрация: 20.11.2012
Сообщений: 795
|
||||||
19.02.2013, 16:34 | 7 | |||||
GetFileSize(обрати внимание на второй параметр) http://msdn.microsoft.com/en-u... s.85).aspx
1
|
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 8
|
||||||
20.02.2013, 13:09 [ТС] | 8 | |||||
Переделал все с учетом работы с большими файлами, намучался с этими типами данных...но теперь как-то криво работать начало. Вроде считает строки, но для разных размеров буфера памяти выдает разные результаты.
Для примера скормил словарь обьемом в 835Мб своей проге и сторонней, выдаются разные варианты. Скорей всего логическая ошибка, помогите выявить. Сам код вот какой теперь:
0
|
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 8
|
|
20.02.2013, 14:45 [ТС] | 9 |
Все, сам нашел, забыл вставить вычисление офсета для всех непоследних итерраций... строки считались постоянно для нулевого офсета
0
|
20.02.2013, 14:45 | |
20.02.2013, 14:45 | |
Помогаю со студенческими работами здесь
9
Подсчет слов в текстовом файле Подсчет слов в текстовом файле Подсчет символов в текстовом файле Подсчет символов в текстовом файле. Подсчет количства слов в текстовом файле Подсчет количества абзацев в текстовом файле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |