![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Построчное чтени большого текстового файла
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;