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

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

Текстовый файл огромного размера


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

ИМХО ©   (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]

Толян, дык памяти никакой не хватит на гиговый текстовый файл!


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

Наверх

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