Форум программистов, компьютерный форум CyberForum.ru

Подсчет строк в гигантском текстовом файле > 4 Гб - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Односвязный список: оптимальное удаление элемента http://www.cyberforum.ru/cpp-beginners/thread789677.html
оптимальный способ удаления из односвязное списка любого элемента списка?
C++ "4102" в конце файла при записи Я не программист, я радиофизик, но у меня возникла необходимость написать программу на c++ Суть проблемы: по нажатии на кнопку в файл пишутся некоторые значения массива. но при работе в различных режимах, так или иначе файл заканчивается цифрами "4102" с новой строки. По количеству значений видно, что эти цифры просто дописываются (не вместо последнего числа) Мне не ясен источник этой... http://www.cyberforum.ru/cpp-beginners/thread789675.html
Выделение памяти для двухмерного массива внутри функции C++
Здравствуйте. Предположим, есть код: #include <iostream> #include <iomanip> #include <cstdlib> #include <time.h> using std::cout; using std::endl;
Проверка числа на то, что оно целое C++
Помогите пожалуйста выловить ошибку: Функция должна проверять введенную пользователем строку. Если строка - целое число, возвращать его. Но что-то идет не так, может кто со свежей головой поможет разобраться. Функция проверяет посимвольно строку, и если символ не цифра, то просит повторить ввод, если цифра - заносит в массив. При всех цифрах, цикл заканчивается и делается преобразование...
C++ Найти все парные трехзначные числа, сумма которых не превышает 10 http://www.cyberforum.ru/cpp-beginners/thread789663.html
Найти все парные трехзначные числа, сумма которых не превышает 10. Зарание спасибо :)
C++ Массив строк Здравствуйте. Разбираюсь с массивами :) Вопрос: почему при выполнении программы выдаются адреса памяти, а не строки? #include <iostream> using namespace std; int main() { int a= подробнее

Показать сообщение отдельно
jkchief
0 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 8

Подсчет строк в гигантском текстовом файле > 4 Гб - C++

19.02.2013, 01:25. Просмотров 789. Ответов 8
Метки (Все метки)

Всем привет, я новичок в С++, но очень стараюсь. Прочитал Дейтелов и теперь хочу сделать что-то практическое и полезное.

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

Начало было положено с написания кода, который выполнял подсчет строк в файле с помощью std::getline(), но к сожалению гетлайн не подходит для работы с большими файлами, и считает долго. Гигантский файл в память не загрузишь.

Второй итерацией был написан код, представленный чуть ниже, в нем использовал принцим File memory mapping. И чтение файла ведется порциями по 1 МБ.
Написано в VS2012 С++.
Все работает чудесно, но уперся в ограничение 32 битов unsigned long.... обрабатывает файлы до 4 гб.
А у меня на винте лежит словарик в 24 Гб....хотелось бы его посчитать.
Подскажите ответ на 2 вопроса:
1) можно ли побороть проблемму на 32 битной системе
2) куда копать чтобы реализовать на 64 битах?

Реально первая прога, которую написал не по учебнику, был бы также рад услышать конструктивную критику если заметите признаки говнокода.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::cerr;
#include <string>
using std::string;
#include <fstream>
using std::ifstream;
#include <Windows.h>
 
 
string man = "This is programm to count number of lines in text file.\nTo use program type:\ncounter.exe \"filename\"\n\n";
static int numlines=1;
DWORD BUFFERSIZE = 1048576;//buffer size for memory mapping. 1 Mb by default. You can change it to play with performance.
HANDLE hMapFile;      // handle for the file's memory-mapped region
HANDLE hFile;         // the file handle
DWORD dwFileSize;     // temporary storage for file sizes
LPVOID lpMapAddress;  // pointer to the base address of the memory-mapped region
SYSTEM_INFO SysInfo;  // system information; used to get granularity
DWORD dwSysGran;      // system allocation granularity
char * pData;         // pointer to the data
DWORD dwi=0;          // loop counter
BOOL bFlag;           // a result holder
DWORD dwMapViewSize;  // number of bytes to map
DWORD dwCurrentPosition; //position where to start mapping of the file
DWORD dwIterationTimes; //number of iterations to mat the file to the memory
DWORD dwFileMapSize;   // size of the file mapping
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    //we accept only one file name
    if (argc != 2 ){cout << man; 
    exit(1);}
     _tprintf(TEXT("Open file \"%s\" for line counting.\n"), argv[1]);
 
// Open the file 
  hFile = CreateFile(argv[1],
                     GENERIC_READ,
                     0,
                     NULL,
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL,
                     NULL);
 
  if (hFile == INVALID_HANDLE_VALUE)
  {_tprintf(TEXT("Target file \"%s\" does not exist. Try to check spelling.\n"), argv[1]);
    exit(1);};
 
 
    //Now we will count some variables ************************************
    //Gety file size.
    dwFileSize = GetFileSize(hFile,  NULL);
    _tprintf(TEXT("File size is: %3d bites\n"), dwFileSize); 
 
    // Get the system allocation granularity.
    GetSystemInfo(&SysInfo);
    dwSysGran = SysInfo.dwAllocationGranularity;
    //_tprintf(TEXT("system allocation granularity is: %d\n"), dwSysGran);
 
    //Calculate number iterations to read all file maps
    
    if (dwFileSize <= BUFFERSIZE) {dwIterationTimes = 1;};
            if (dwFileSize > BUFFERSIZE) {
                DWORD dba = dwFileSize % BUFFERSIZE ;
                if ( dba == 0)  {dwIterationTimes = dwFileSize / BUFFERSIZE;};
                if (dba > 0)  {dwIterationTimes = (dwFileSize / BUFFERSIZE)+1;};
            };
        //_tprintf(TEXT("Iterations: %3d\n"), dwIterationTimes);
 
 
        // now we count some changing variables for cycle
        for  (DWORD c=0 ; c < dwIterationTimes; c=c+1 ) {
                //Count file mapping size and wiev size size for NOT last itteration
                if (c < dwIterationTimes-1){
                    dwMapViewSize=BUFFERSIZE;
                    dwFileMapSize = (c * BUFFERSIZE)  + BUFFERSIZE; //file mapping size
                    //_tprintf (TEXT("The middle file mapping object is %ld bytes large for %ld itteration\n"),dwFileMapSize, c+1);
                    };
 
                ///Count file mapping size and wiev size for last itteration itteration
                if (c == dwIterationTimes-1){
                    DWORD d = (dwFileSize - (c * BUFFERSIZE));//length of last part (less than buffersize)
                    //_tprintf (TEXT("Current offset is %ld, Length of last part of file is %ld \n"),(c * BUFFERSIZE), d);
                    dwMapViewSize = d;
                    dwFileMapSize = dwFileSize;
                    //_tprintf (TEXT("The LAST file mapping object is %ld bytes large for %ld itteration\n"),dwFileMapSize, c+1);
                };//if it is last operation we do not need to allocate all buffer size
        
        
                // Create a file mapping object for the file
                hMapFile = CreateFileMapping( hFile,          // current file handle
                    NULL,           // default security
                    PAGE_READONLY,  // read permission
                    0,              // size of mapping object, high
                    dwFileMapSize,  // size of mapping object, low
                    NULL);          // name of mapping object
                //That it is a good idea to ensure the file size is not zero
                if (hMapFile == NULL)
                    {
                    _tprintf(TEXT("hMapFile is NULL\n"));
                    exit(2);
                    };
 
                // Map the view and test the results.       
                lpMapAddress = MapViewOfFile(hMapFile,            // handle to mapping object
                               FILE_MAP_READ,       // read/write
                               0,                   // high-order 32 bits of file offset
                               (c * BUFFERSIZE),    // low-order 32 bits of file offset
                               dwMapViewSize);      
                if (lpMapAddress == NULL)
                {
                _tprintf(TEXT("lpMapAddress is NULL: last error: %d\n"), GetLastError());
                exit(1);
                }
                else {
                //  _tprintf(TEXT("lpMapAddress is: %d\n"), lpMapAddress);
                };
 
 
                //pointer to the data.
                pData = (char *) lpMapAddress ;
 
                // At last!!! Data processing.************************************************* 
  
                for (dwi=0; dwi < dwMapViewSize ; dwi=dwi+1) {
                if (pData[dwi] == '\n'){numlines++;};
                };
                
 
                // Close the file mapping object and the open file
                 bFlag = UnmapViewOfFile(lpMapAddress);
                 bFlag = CloseHandle(hMapFile); // close the file mapping object
                 if(!bFlag) { _tprintf(TEXT("\nError %ld occurred closing the mapping object!"), GetLastError());}
 
        };//end of for
 
        bFlag = CloseHandle(hFile);   // close the file itself
        if(!bFlag) { _tprintf(TEXT("\nError %ld occurred closing the file!"), GetLastError());}
        
        
        cout << "Number of lines in our file is: " << numlines << endl;
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru