![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Текстовый файл огромного размера
ИМХО © (2004-10-16 20:39:00)Гсопода, как работать с текстовым файлом огромного размера (>300 MB)? Понятно, что не при помощи TStringList.
ИМХО (2004-10-17 16:02:00) [21]
> panov © (17.10.04 15:40) [29]
> В таком случае работа с файлом, как с текстовым, не подходит.
>
> Существует такой выход:
черт меня подери, а ведь это ИДЕЯ! Сенкс!
ИМХО (2004-10-17 16:01:00) [22]
> VMcL © (17.10.04 15:39) [28]
> >>ИМХО © (17.10.04 15:36) [26]
>
> Строки фиксированной длины?
к сожалению, нет :(
panov (2004-10-17 15:40:00) [23]>ИМХО © (17.10.04 15:36) [26]
В таком случае работа с файлом, как с текстовым, не подходит.
Существует такой выход:
1. Проход по файлу как по текстовому с вычислением смещений начала и конца каждой строки относительно начала файла.
2. Формирование дополнительного файла с индексами(по существу, это и будет своеобразный индексный файл).
3. Далее работаем с файлом как с файлом произвольного доступа.
Любую строку теперь можно получить по ее индексу, вычисляя смещение относительно начала файла.
VMcL (2004-10-17 15:39:00) [24]>> ИМХО © (17.10.04 15:36) [26]
Строки фиксированной длины?
ИМХО (2004-10-17 15:38:00) [25]300 метров - это самое малое, что есть.
ИМХО (2004-10-17 15:36:00) [26]сорри, СУБД отпадает. Решение должно быть проще.
Как теперь вытащить из текстового файла строки, скажем, с 2111570 по 2111710?
panov (2004-10-17 15:35:00) [27]Кстати, 300Мб - не очень большой объем логов.
У меня обрабатываются журналы размером около 2Гб.
panov (2004-10-17 15:34:00) [28]>ИМХО © (17.10.04 15:30) [21]
Но как затем организовать быстрый доступ по индексу?
А индекс где будешь хранить?
panov (2004-10-17 15:33:00) [29]Для быстрой обработки больших объемов информации с произвольным доступом существуют СУБД.
Вывод очевиден - данные нужно закачивать в БД.
Второй вариант - писать свою систему управления БД, заточенную именно на эти данные.
ИМХО (2004-10-17 15:32:00) [30]Seek не работает с текстовыми файлами!!!
ИМХО (2004-10-17 15:30:00) [31]да, все правильно, меня ReadLn устроило. При первом открытии я узнал начальные позиции сообщений. Но как затем организовать быстрый доступ по индексу?
panov (2004-10-17 15:28:00) [32]Зачем тебе в память закачивать весь файл или куски?
Чем тебя ReadLn не устраивает?
Приведи хотя бы одну причину, почему тебя советы использовать последовательную обработку файла не устраивают. Иначе остальное - пустая болтовня.
ИМХО (2004-10-17 15:28:00) [33]
> Sergey_Masloff (17.10.04 14:55) [17]
> Порядка 2 ГБ. Даже если оперативки 32 Мб. Или 16...
Изволите шутить, товарищ Маслофф? А как насчет Out of Memory?
VMcL (2004-10-17 15:00:00) [34]>> Sergey_Masloff (17.10.04 14:55) [17]
> Порядка 2 ГБ. Даже если оперативки 32 Мб. Или 16...
Ну, наверное, не совсем так. Зависит от размера файла подкачки.
>> ИМХО © (17.10.04 14:43) [16]
См. [3]. Только лучше использовать буфер не фиксированного размера, а размером с какую-то часть от общего объема ОЗУ, например, 25% (можно вообще в программе настройку соответствующую сделать).
Sergey_Masloff (2004-10-17 14:55:00) [35]ИМХО © (17.10.04 14:43) [16]
>Еще такой вопрос по сабжу.
>Вот у меня на компе 158 MB оперативки.
Порядка 2 ГБ. Даже если оперативки 32 Мб. Или 16...
ИМХО (2004-10-17 14:43:00) [36]Еще такой вопрос по сабжу.
Вот у меня на компе 158 MB оперативки.
Это какого объема текстовый файл можно загрузить в TStringList?
ИМХО (2004-10-17 13:14:00) [37]
> Anatoly Podgoretsky © (17.10.04 12:24) [13]
> Это с ReadLn то, посмотри размер строк в ящиук, ты врядли
> увидишь свыше 80 байт, в крайнем случае несколько килобайт.
> Другое дело если у тебя Д5-
Да, у меня Delphi 5. Как это меняет дело?
Verg (2004-10-17 12:36:00) [38]Что-нибудь тапа этого
type
TMemFile = record
HFile, HMap : THandle;
Size : DWORD;
BaseAddress : pointer;
end;
procedure AllocMemFile(const F : string;var MemFile : TMemFile);
begin
FillChar(MemFile, sizeof(MemFile),0);
with MemFile do
begin
HFile:=CreateFile(pchar(F), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0,0);
if HFile<>INVALID_HANDLE_VALUE then
begin
Size:=GetFileSize(HFile, nil);
HMap:=CreateFileMapping(HFile, nil, PAGE_READONLY,0,0,nil);
if (HMap<>0) and (Size<>$FFFFFFFF) then
begin
BaseAddress:=MapViewOfFile(HMap,FILE_MAP_READ,0,0,0);
if BaseAddress=nil then
begin
CloseHandle(HMap);
CloseHandle(HFile);
HFile:=INVALID_HANDLE_VALUE;
HMap:=0;
end;
end else
begin
CloseHandle(HFile);
HFile:=INVALID_HANDLE_VALUE;
end;
end;
end;
end;
procedure FreeMemFile(var MemFile : TMemFile);
begin
with MemFile do
if (HFile<>INVALID_HANDLE_VALUE) and (BaseAddress<>nil) and (HMap<>0) then
begin
UnmapViewOfFile(BaseAddress);
CloseHandle(HMap);
CloseHandle(HFile);
FillChar(MemFile, sizeof(MemFile),0);
HFile:=INVALID_HANDLE_VALUE;
end;
end;
Anatoly Podgoretsky (2004-10-17 12:24:00) [39]Это с ReadLn то, посмотри размер строк в ящиук, ты врядли увидишь свыше 80 байт, в крайнем случае несколько килобайт.
Другое дело если у тебя Д5-
ИМХО (2004-10-17 12:20:00) [40]Толян, дык памяти никакой не хватит на гиговый текстовый файл!