Форум программистов, компьютерный форум 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
20.02.2013, 13:09  [ТС]     Подсчет строк в гигантском текстовом файле > 4 Гб
Переделал все с учетом работы с большими файлами, намучался с этими типами данных...но теперь как-то криво работать начало. Вроде считает строки, но для разных размеров буфера памяти выдает разные результаты.
Для примера скормил словарь обьемом в 835Мб своей проге и сторонней, выдаются разные варианты.
Скорей всего логическая ошибка, помогите выявить.
Подсчет строк в гигантском текстовом файле > 4 Гб

Сам код вот какой теперь:

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
#include "stdafx.h"
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::cerr;
#include <string>
using std::string;
#include <Windows.h>
#include <time.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;
LARGE_INTEGER liBufferSize; //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
LARGE_INTEGER liFileSize; // temporary storage for file sizes for big files
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
int inti=0;          // loop counter for data manipulation
BOOL bFlag;           // a result holder
int intIterationTimes; //number of iterations to mat the file to the memory
LARGE_INTEGER liMapViewSize;  // number of bytes to map
LARGE_INTEGER liOffset; //current position holder
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    clock_t tStart = clock();
    liBufferSize.LowPart = 1048576;// 1 Mb by default. You can change it to play with performance.
    
    //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.
    GetFileSizeEx(hFile, &liFileSize);
    _tprintf(TEXT("File size is: %I64d bites\n"), liFileSize.QuadPart); 
    
    // 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 (liFileSize.QuadPart <= liBufferSize.QuadPart) {intIterationTimes = 1;};
    if (liFileSize.QuadPart > liBufferSize.QuadPart) {
                LONGLONG dba = liFileSize.QuadPart % liBufferSize.QuadPart ;
                if ( dba == 0)  {intIterationTimes = (int)(liFileSize.QuadPart / liBufferSize.QuadPart);};
                if (dba > 0)  {intIterationTimes = (int)((liFileSize.QuadPart / liBufferSize.QuadPart)+1);};
    };
    _tprintf(TEXT("Iterations: %u \n"), intIterationTimes);
 
    // Create a file mapping object for the file
    hMapFile = CreateFileMapping( hFile,          // current file handle
            NULL,           // default security
            PAGE_READONLY,  // read permission
            (DWORD)liFileSize.HighPart,  // size of mapping object, high
            liFileSize.LowPart, // 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);
    };
 
 
    // now we count some changing variables for cycle
    for  (int intc=0 ; intc < intIterationTimes; intc++ ) {
        //Count  map wiev size  for NOT last itteration
        if (intc < intIterationTimes-1){
            liMapViewSize.LowPart=liBufferSize.LowPart;
        //  _tprintf (TEXT("The middle file mapping view is %I64d bytes large for %i itteration\n"),liMapViewSize.QuadPart, (intc+1));
            };
 
        ///Count file wiev size and current offset for last itteration 
        if (intc == intIterationTimes-1){
            liMapViewSize.QuadPart = (liFileSize.QuadPart - (   (LONGLONG)intc * liBufferSize.QuadPart)  );//length of last part (less than liBufferSize)
            liOffset.QuadPart= (LONGLONG)intc * liBufferSize.QuadPart;
            _tprintf (TEXT("Current offset is %I64d, Length of last part of view is %I64d \n"),liOffset.QuadPart, liMapViewSize.QuadPart);
            };//if it is last operation we do not need to allocate all buffer size
        
 
        // Map the view and test the results.       
        lpMapAddress = MapViewOfFile(
                hMapFile,               // handle to mapping object
                FILE_MAP_READ,          // read/write
                liOffset.HighPart,      // high-order 32 bits of file offset
                liOffset.LowPart ,      // low-order 32 bits of file offset
                liMapViewSize.LowPart);  //length of the view    
        
        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 (inti=0; (DWORD)inti < liMapViewSize.LowPart ; inti++) {
                if (pData[inti] == '\n'){numlines++;};
                };
                
 
        // Close the file mapping object and the open file
         bFlag = UnmapViewOfFile(lpMapAddress);
                
    };//end of for
 
    bFlag = CloseHandle(hMapFile); // close the file mapping object
    if(!bFlag)  { _tprintf(TEXT("\nError %ld occurred closing the mapping object!"), GetLastError());}
    bFlag = CloseHandle(hFile);   // close the file itself
    if(!bFlag) { _tprintf(TEXT("\nError %ld occurred closing the file!"), GetLastError());}
        
    //now we cout the reults
    cout << "Number of lines in our file is: " << numlines << endl;
    printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
 
    return 0;
}
 
Текущее время: 00:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru