Сейчас на форуме: vasilevradislav, rmn, Magister Yoda (+7 невидимых)

 eXeL@B —› Программирование —› Скрытие тяжёлых вычислений
Посл.ответ Сообщение

Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 08 июля 2008 08:49 · Поправил: Freecod
· Личное сообщение · #1

Есть алго, ищет строчку в куче файлов. К поиску в принципе претензий нет, всё работает, но нужно в фоне, а он кушает от процессора много %. Мне бы 1-2% и всё, да и оптимизировать это дело...
Принцип:
* Находим файл
----
* Открываем
* ReadFile на размер буфера
* Ищем в буфере
* Если в буфер попал весь файл - выход. Если нет - 2 шага назад

Собственно пихаю ожидание перед чтением очередной порции, WaitofSingleObject(10), но судя по всему он успевает разогнаться на % на стадии парсинга буфера.

Собственно не поделитесь примерами макс. оптимизированного открытия \ чтения файла и может есть какие-то другие "фишки" тихой, но быстрой работы?




Ранг: 196.6 (ветеран), 11thx
Активность: 0.070.01
Статус: Участник

Создано: 08 июля 2008 09:43
· Личное сообщение · #2

создавай отдельный поток, ставь ему приоритет чуть выше Idle, и он пускай делает всю работу



Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 08 июля 2008 09:52
· Личное сообщение · #3

[wl] пишет:
создавай отдельный поток, ставь ему приоритет чуть выше Idle, и он пускай делает всю работу

тогда задача будет выполнятся в фоне используя все свободные ресурсы, а если я правильно понял автора то нужно что бы задача сама по себе ела мало ресурсов, не создавая нагрузки на процессор (видимо что бы не палится )

Freecod
если процессор разгоняется на парсинге то делай минимальный sleep внутри цикла парсинга




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 08 июля 2008 10:01
· Личное сообщение · #4

Freecod пишет:
Собственно не поделитесь примерами макс. оптимизированного открытия \ чтения файла

Смотри в сторону маппинга файла в память.



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 08 июля 2008 10:09 · Поправил: Freecod
· Личное сообщение · #5

Мэппинг больших файлов насилует память вплоть до размера файла. Если есть способ мэппить файл кусками или как-то иначе, чтоб не жрать память - слушаю.
Минимальный слип в поиске в файле размером 100 кб убивает на поиск 3 минуты... Думаю уменьшать буфер надо.



Ранг: 110.7 (ветеран)
Активность: 0.070
Статус: Участник
~ tPORt ~

Создано: 08 июля 2008 10:56 · Поправил: LazzY
· Личное сообщение · #6

ну дык http://msdn.microsoft.com/en-us/library/aa366761.aspx три последних параметра заюзайте и будем вам мапинг по частям.. правда можно мапить только выровненными кусками(

ps: у меня параноя, или http://www.exelab.ru/f/action=vthread&forum=6&topic=11933& page=0 дубль



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 08 июля 2008 11:30
· Личное сообщение · #7

Что-то не пойму.
pMemory = MapViewOfFile(hMapFile,FILE_MAP_READ,0,0, SizeReadBuffer); // SizeReadBuffer = 1048576;
Сразу первый файл 10 кб - возвращает 0, код ошибки 0x05
И как будет двигаться окошко, если учесть что мне не нужны файлы больше гига?



Ранг: 50.2 (постоянный)
Активность: 0.010
Статус: Участник

Создано: 08 июля 2008 17:01
· Личное сообщение · #8

http://www.google.com/codesearch?q=MapViewOfFile+lang%3Ac http://www.google.com/codesearch?q=MapViewOfFile+lang%3Ac
4я ссылка



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 08 июля 2008 23:21
· Личное сообщение · #9

LazzY: Это параноя =) Мне казалось я прошлую тему на си форуме создавал... Вообщем тогда я так ни к чему не пришёл, а доделать хочу.




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 09 июля 2008 00:16
· Личное сообщение · #10

Короче что вы тут все трете-то, все же уже сказали: частичный мапинг + слипы в цикле + отд. поток с низким приоритетом - и не парься.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 09 июля 2008 00:18
· Личное сообщение · #11

Что-то вообще никак, даж мсдн не помогает. Ладно, если файл меньше буфера - ставлю в качестве размера считываемых байт всю его длинну. Читает. Но если больше! Делаю -
pMemory = MapViewOfFile(hMapFile,FILE_MAP_READ,0, allpos, sizebuf); // allpos - текущая позиция по файлу, sizebuf - кол-во чит. байт.

Первый раз - allpos = 0 читает, всё ок. Второй - allpos сдвинулся - снова облом.
Если верить мсдн - allpos должен быть выровнен. Но я же читаю сплошной массив байт, что, если искомая строка оказалась разрезанна границей? Приходиться при близости конца при встрече символов, с которых может начинаться строка, оставлять а потом открывать с этого же места. Есть идеи?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 июля 2008 01:02
· Личное сообщение · #12

drin пишет:
тогда задача будет выполнятся в фоне используя все свободные ресурсы

Отдельный поток сам по себе не может сожрать много ресурсов ну если это тольео не EBFE, а с низким приоритетом так вообще будет незаметно.

Freecod есть такая прога Search&Replace (залил сюда uploaded.to/?id=f10o2t), я был поражен когда задал ей искать строки в папке с игрой. Мало того что она единственная нашла эти строки (даже WinHex в указанном файле не нашел ни в одной кодировке), так еще файл размером в 14 мб она просканила за доли секунды. Посмотри как там реализовано.

-----
Yann Tiersen best and do not fuck




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 09 июля 2008 02:33
· Личное сообщение · #13

PE_Kill: ок, спасибо.

Поделитесь ещё ответом на такой вопрос - какой размер ближе к половине мегабайта будет всегда выровнен?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 09 июля 2008 07:18
· Личное сообщение · #14

PE_Kill пишет:
Отдельный поток сам по себе не может сожрать много ресурсов ну если это тольео не EBFE, а с низким приоритетом так вообще будет незаметно.

Эта, если в любом потоке сделать "for (;;) ;" (или что-то что ест проц в мелком цикле), то CPU usage мгновенно вырастет до 100%. В случае с низким приоритетом просто OS отдаст процессорное время любому другому потоку и, следовательно, не будет видимых тормозов. (если scheduler работает правильно).

Так что, что бы не было пиков в графе CPU usage, не надо кушать сей ресурс. Sleep().



Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 09 июля 2008 08:01 · Поправил: drin
· Личное сообщение · #15

Freecod
кстати, можно попробовать упростить задачу контроля исползования цыклов CPU - всю работу делать в отдельном потоке, а в основном или другом его останавливать/запускать, вот тебе элементарный пример который ест ровно 2% CPU, правда боюсь с тяжолой работой будет не все так четко но в пределах удержится, в данном случае можно уменьшить кратность слипов (1/49) для большей "гладкости" но и накладных расходов будет больше и наоборот увеличив кратность, например (10/490), будут скачки маленькие но зато накладных расходов на остановку/запуск а так же сон внутри контрлирующего потока будет значительно меньше


function WorkThrd(Param: dword): dword; stdcall;
begin
while true do begin
Form1.Edit1.Text := IntToStr(Param);
inc(Param);
end;
end;

function CtrlThrd(hWorkThrd: dword): dword; stdcall;
begin
while true do begin
ResumeThread(hWorkThrd);
sleep(2);
SuspendThread(hWorkThrd);
sleep(98);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
ThrdID, hWorkThrd: dword;
begin
hWorkThrd := CreateThread(nil, 0, @WorkThrd, nil, CREATE_SUSPENDED, ThrdID);
CreateThread(nil, 0, @CtrlThrd, Ptr(hWorkThrd), THREAD_PRIORITY_ABOVE_NORMAL, ThrdID);
end;




Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 10 июля 2008 22:25
· Личное сообщение · #16

Что бы далеко не отходить...

У кого есть в наличии установленный Windows SDK, залейте плз .h и .lib для следующих файлов:
icmpapi.h
ipexport.h
iphlpapi.h
и связанные с ними файлы из SDK, если требуются.
У меня VC6, так что борландовские не подходят, а SDK скачать не могу...




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 10 июля 2008 23:38
· Личное сообщение · #17

Freecod, в последних версиях SDK есть компилер (ессно из VS). Либы могут не подойти... Формат debug info изменился, хотя сами .obj, которые в .lib, должны быть обычными...

Вот headers. Кста, замучаешься исправлять все #includes... Какие либы нужны?

0cdc_10.07.2008_CRACKLAB.rU.tgz - headers.tar.bz2



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 11 июля 2008 00:32
· Личное сообщение · #18

Блин, сколько связей всплывает...
Ещё нужны:

iprtrmib.h
iptypes.h

либы:

iprtrmib.lib
iptypes.lib
icmpapi.lib
ipexport.lib
iphlpapi.lib




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 11 июля 2008 01:02
· Личное сообщение · #19

начинай резать headers а то понадобится весь SDK.

e86d_10.07.2008_CRACKLAB.rU.tgz - headers.tar.bz




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 11 июля 2008 01:03
· Личное сообщение · #20

вот lib. Остального нету в PaltformSDK...

4b7b_10.07.2008_CRACKLAB.rU.tgz - IPHlpApi.Lib.bz2



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 11 июля 2008 01:14
· Личное сообщение · #21

Спасибо, очень выручил. 1гб этого SDK ради 5 файлов...



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 11 июля 2008 01:49
· Личное сообщение · #22

Недеюсь модеры не будут против, если я сюда все текущие проблемы солью =)

Хочу вызывать функцию из z.asm. У меня VC6, так что добавил файл, в настройках настроил компиляцию (С:\masm32\bin\ml.exe /c /coff /nologo $(InputPath) \ .\$(InputName).obj)

В z.asm поправил - вместо start:
.code
PUBLIC _cleanoff
_cleanoff PROC NEAR

Файл собирается в объектник без проблем.
Теперь хочу вызвать его из x.cpp
В шапке
extern "C" void cleanoff ();
вызов
cleanoff();

При линковке x.obj
x.obj : error LNK2001: unresolved external symbol _cleanoff
Release/x.exe : fatal error LNK1120: 1 unresolved externals

Что делаю не так?



Ранг: 5.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 июля 2008 03:32
· Личное сообщение · #23

Объясните мне, идиоту, почему нужно делать отдельным файлом, вместо того, чтобы в __asm запихать?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 11 июля 2008 07:40 · Поправил: s0larian
· Личное сообщение · #24

Freecod, в VS2003+ ещё надо сказать какой файл на выходе, а иначе dependencies (зависимости) говнятся. Посмотри в linker command line - есть твой файл? Ну а потом "dumpbin z.obj" - проверь есть ли ф-ция и её имя.

З.Ы. "cleanup" на аглицкой мове



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 12 июля 2008 00:53 · Поправил: Freecod
· Личное сообщение · #25

droid: а разве можно запихать в __asm {} всю программу на asm целиком? Начиная с .386 и заканчивая END?
s0larian: у меня VS6
PS я отключаю отчистку - так что cleanoff =)



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 12 июля 2008 10:20
· Личное сообщение · #26

кстати, как избавиться от
LINK : warning LNK4089: all references to "NETAPI32.dll" discarded by /OPT:REF
то есть если я не делаю
#pragma comment(lib,"netapi32.lib")
То прёт ошибки при линковке, а так даёт варнинг. Что ему не нравиться?




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 12 июля 2008 23:51 · Поправил: 4kusNick
· Личное сообщение · #27

ну дык опция линкера /OPT:REF отрубает все ссылки на NETAPI32.dll, ибо
OPT - оптимизация
REF - по ссылкам
вкури
msdn.microsoft.com/en-us/library/bxwfs976(VS.80).aspx
на всяк случай...
там кста еще написано, что:
The /OPT:REF option disables incremental linking

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.



 eXeL@B —› Программирование —› Скрытие тяжёлых вычислений
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати