Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с большими текстовыми файлами, Чтение, запись, поиск 
:(
    Опции темы
greenpc
Дата 19.2.2008, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 29.1.2007

Репутация: нет
Всего: нет



mutex
немного расширю твою идею
держать один файл с логом
и еще один файл индексов. например с номером строки в логе и темже хешем сторки
соответствено сразу можно после открытия файла лога перейти на нужную строку

Poseidon, зато не кушаю память smile,
на текущий момент средняя скорость чтения с винта 20-30 мб/с
а если файл еще записан одним куском (не дефрагментирован) то скорости должно хватить

ЗЫ: например Kerio держит в файле индексов абсолютное смещение от начала файла, соответственно нет фиксированной длины строки.
делаем seek & readln. кстати для лога 30мб файл индесков всего 800к

Это сообщение отредактировал(а) greenpc - 19.2.2008, 08:54
PM   Вверх
Stern87
Дата 19.2.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.11.2007
Где: Украина

Репутация: нет
Всего: нет



Ребята!
Да не лог это. Это своеобразный индекс-файл: строка HTTP-адреса (текст, рисунок - всё что только может запросить браузер), а следующие строки - HTTP-заголовки этого адреса; потом опять строка HTTP-адреса, заголовки и так по кругу. Он может и выглядит из-за этого как лог, но им он не является.
Еще заметил, что когда я вызываю
Код

strno := Pos(link, indx.Text);
где indx - TStringList, то функция Pos зажирает примерно столько, сколько весит индекс файл. И не освободит память до тех пор, пока программа не выйдет из функции в которой и была вызвана эта Pos!!
Определил это на глаз с помощью sleep(7000).
Может я чего-то не понимаю? Почему Pos не освободил память, которую он для себя занял?
PM WWW ICQ Skype   Вверх
Rennigth
Дата 19.2.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(Stern87 @  19.2.2008,  11:42 Найти цитируемый пост)
Почему Pos не освободил память, которую он для себя занял? 

Все он освободил, просто системе значит эта память пока не нужна. Как понадобиться она ее заберет.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
ASGDeveloper
Дата 19.2.2008, 13:56 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Мдя... smile

1) Качаешь этот архив: http://www.torry.net/vcl/internet/html/Alc...cmp_3_52_15.zip
2) Находишь там юнит alFcnString
3) Используешь в своей программе аналоги функций, Pos -> ALPos, таким образом увеличишь скорость работы и не придется бороться с форматом
4) Внимательно посмотри состав архива, может еще что-нить интересное для себя найдешь.

5) Дополнительно, для освобождения памяти попробуй почаще вызывать такую функцию:
Код

procedure TrimWorkingSet;
var
  MainHandle: THandle;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
    SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
    CloseHandle(MainHandle);
  end;
end;


ЗЫ Я конечно бы рекомендовал использовать базу данных. Ну раз хочется - то попробуй мой совет. В противном случае тебе здесь никто больше помочь ничем не сможет. smile

Это сообщение отредактировал(а) ASGDeveloper - 19.2.2008, 13:58
PM MAIL   Вверх
Poseidon
Дата 19.2.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Stern87 @  19.2.2008,  11:42 Найти цитируемый пост)
Да не лог это. Это своеобразный индекс-файл: строка HTTP-адреса (текст, рисунок - всё что только может запросить браузер), а следующие строки - HTTP-заголовки этого адреса; потом опять строка HTTP-адреса, заголовки и так по кругу. Он может и выглядит из-за этого как лог, но им он не является.
Тогда объясни нам зачем эти данные пользователям? Зачем они ими обмениваются?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Stern87
Дата 19.2.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.11.2007
Где: Украина

Репутация: нет
Всего: нет



Каждый их использует по-своему.
PM WWW ICQ Skype   Вверх
lukas
Дата 19.2.2008, 21:16 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



возьми модуль QStrings, работа со строками, для сравнения я проверял аналогичная функция Q_PosStr работает ровно в 4 раза быстрее чем стандартная функция Pos, что уж говорить о других аналогичных функциях в этом модуле... Из всего что я перепробовал, этот модуль самый быстрый при работе со строками (например тот же AcedUtils и FastStrings работает медленнее QStrings), а вообще еще раз повторюсь, используй массив вместо tstringlist, по крайней мере поиск будет в раз десять быстрее....


--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Stern87
Дата 19.2.2008, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.11.2007
Где: Украина

Репутация: нет
Всего: нет



Цитата(ASGDeveloper @  19.2.2008,  12:56 Найти цитируемый пост)
3) Используешь в своей программе аналоги функций, Pos -> ALPos, таким образом увеличишь скорость работы и не придется бороться с форматом

Код
var ALPos: function(const SubStr: AnsiString; const Str: AnsiString): Integer;
{from FastCode John O'Harrow ([email protected])
 original name: CharPosJOH_IA32, CharPosJOH_MMX, CharPosJOH_SSE, CharPosJOH_SSE2}

Я и так использую модуль FastCode (а также FastMove) в своих компонентах.

Это сообщение отредактировал(а) Stern87 - 19.2.2008, 21:53
PM WWW ICQ Skype   Вверх
ASGDeveloper
Дата 20.2.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Цитата(Stern87 @  19.2.2008,  21:51 Найти цитируемый пост)
Я и так использую модуль FastCode

И там есть такая функция? 
PM MAIL   Вверх
Stern87
Дата 20.2.2008, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.11.2007
Где: Украина

Репутация: нет
Всего: нет



Цитата(ASGDeveloper @  19.2.2008,  23:30 Найти цитируемый пост)
И там есть такая функция?

Цитата
from FastCode John O'Harrow ([email protected])
 original name: CharPosJOH_IA32, CharPosJOH_MMX, CharPosJOH_SSE, CharPosJOH_SSE2

PM WWW ICQ Skype   Вверх
WaReZMEN
Дата 20.2.2008, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



а де  QString   скачать? Нашел правда последнее изменение в 2000 году были может и не то... Но я провел эксперемен взял текстовый файл размером 50000 строк (2.6 мб) 
Делал я слудующие искал в каждои строке символ "=" и все что боло до него писал в БД.
Попробовал 3 способа:

1. Символ искал с помощью Copy если не "=" то прибовлял к строке текущий символ (тоесть проверял каждый символ пока не встречал "=") затрачено времяни 1 минута 27 секунд.

2. Символ искал с помощью Pos затем результат делал с помощью Copy () затрачено времяни 1 минута 32 секунд.

3. Символ искал с помощью Q_PosStr затем результат делал с помощью Q_Copyleft () затрачено времяни 1 минута 48 секунд.
Отсюда вывод что QString нехрена не быстрее... Либо я что то не так делаю...


Это сообщение отредактировал(а) WaReZMEN - 20.2.2008, 04:03
PM MAIL ICQ   Вверх
ASGDeveloper
Дата 20.2.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Цитата(WaReZMEN @  20.2.2008,  01:41 Найти цитируемый пост)
Попробовал 3 способа:

А где пункт 4 с ALPos?
PM MAIL   Вверх
WaReZMEN
Дата 20.2.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 3



ASGDeveloper, а это где взять?
PM MAIL ICQ   Вверх
Stern87
Дата 20.2.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 27.11.2007
Где: Украина

Репутация: нет
Всего: нет



WaReZMEN, внимательно перечитай ветку. или хотя бы последние 15 постов.
QStrings можешь скачать на TORRY.net - просто введи в поиск "QStrings" и всё.

P.S. Q_PosStr хрена и быстрее. просто ты что-то не так делаешь.

Это сообщение отредактировал(а) Stern87 - 20.2.2008, 11:40
PM WWW ICQ Skype   Вверх
lukas
Дата 20.2.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



WaReZMEN

Где нибудь вставь эти 2 процедуры, и сравни что быстрее.... как говориться всю работу со строками я испытал на своей крове, и ни один из FastStrings, AcedUtils не дает больше скорости чем QString, просто нужно смотреть, какие функции там работают быстрее чем обычно, например замена Delete (Q_Delete), тоже работает там намного быстрее чем обычно...

Код

uses QStrings
...

// Стандартная библиотека....
procedure PosEV;
   Var
   I,T: Integer;
begin
T := GetTickCount;
 for i:=0 to 99999999 do 
   Pos('ABC-','CDKJHABC-DKJ');
ShowMessage(IntToStr(GetTickCount-T));
end;

// QString....
procedure QPosEV;
   Var
   I,T: Integer;
begin
T := GetTickCount;
 for i:=0 to 99999999 do 
   Q_PosStr('ABC-','CDKJHABC-DKJ'); 
ShowMessage(IntToStr(GetTickCount-T));
end;




--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.