Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Построчное чтени большого текстового файла


Страницы:   1 2 3

IceBeerg ©   (2005-09-13 18:26:00) 

Подскажите выход из ситуации... Есть большой log файл (более 40 гигов), пытаюсь загружать его в StringList - читается не весь... Попробовал использовать FileStream, но не знаю как через него читать файл построчно... Цель - читать файл построчно, определять дату находящуюся в начале каждой строки и по этой дате выводить данные log'а. Строки файла НЕ одинаковой длинны...


IceBeerg   (2005-09-13 18:55:00) [41]

Игорь Шевченко ©   (13.09.05 18:52) [8]

> Readln для этого придумана

это еще с Паскаля понятно


> Интересно, какой очередной Архангельский рекомендует
> читать файл путем использования StringList, поубивал
> бы.

никакой, сам лажанулся


> Быстрее все равно не сделаешь

а все же хотелось бы, но видимо никак


IceBeerg   (2005-09-13 18:53:00) [42]

isasa ©   (13.09.05 18:48) [6]
в даном моменте то же прийдется использовать метод предложенный PVOzerski по поводу блочного чтения...


Игорь Шевченко   (2005-09-13 18:52:00) [43]

Readln для этого придумана.

Интересно, какой очередной Архангельский рекомендует читать файл путем использования StringList, поубивал бы.

IceBeerg ©   (13.09.05 18:50) [7]


> Это первое, что пришло в голову, но медоенно работает...


Быстрее все равно не сделаешь


IceBeerg   (2005-09-13 18:50:00) [44]

Котик Бегемотик   (13.09.05 18:45) [5]
Это лог 1С за два года!

Изя Губерман   (13.09.05 18:37) [1]
Это первое, что пришло в голову, но медоенно работает...

PVOzerski ©   (13.09.05 18:42) [4]
придется работать через потоки или WinAPI

наведите пожалуйста на район "раскопок" информации по WinAPI, что-то в голову ничего не лезет...


isasa   (2005-09-13 18:48:00) [45]

PVOzerski ©   (13.09.05 18:42) [4]

В этом плане, можно попробовать

BOOL ReadFile(
 HANDLE hFile,                // handle to file
 LPVOID lpBuffer,             // data buffer
 DWORD nNumberOfBytesToRead,  // number of bytes to read
 LPDWORD lpNumberOfBytesRead, // number of bytes read
 LPOVERLAPPED lpOverlapped    // overlapped buffer
);

DWORD: Longword; //0..4294967295 unsigned 32-bit

Будет быстрее, чем ReadLn(...)


Котик Бегемотик   (2005-09-13 18:45:00) [46]

А может уважаемый еще и соизволит обьяснить смысл создания текстового файла такого большого размера ...
40 гигов !!! представляю себе скорость работы с ним :(


PVOzerski   (2005-09-13 18:42:00) [47]

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

Замечу, что если речь идет действительно о десятках гигабайт (а не мегабайт), придется работать через потоки или WinAPI. А то blockread работает со знаковыми 4-байтными целыми применительно к размерам и индексации блоков - на такую позицию будет не перепрыгнуть :(


isasa   (2005-09-13 18:40:00) [48]

Все равно весь файл :) не влезет читай блоками.

String types
Type Maximum length Memory required Used for
ShortString 255 characters 2 to 256 bytes backward compatibility
AnsiString ~2^31 characters 4 bytes to 2GB 8-bit (ANSI) characters, DBCS ANSI, MBCS ANSI, etc.
WideString ~2^30 characters 4 bytes to 2GB Unicode characters; multi-user servers and multi-language applications


Digitman   (2005-09-13 18:38:00) [49]


> Есть большой log файл (более 40 гигов), пытаюсь загружать
> его в StringList - читается не весь


еще бы !

ведь ВАП Win32-процесса ограничен 4-мя Гб, из которых прикл.задаче доступно и того меньше.


> Попробовал использовать FileStream, но не знаю как через
> него читать файл построчно


ну, положим, FileStream явно не предназначен для этого ..

а Assign() + ReadLn() не приходило в голову использовать для оной цели ?

ведь ReadLn() как раз для построчного чтения и предназначен ..


Изя Губерман   (2005-09-13 18:37:00) [50]


while not EoF(f) do begin
 ReadLn(f, s);
end;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо