Сейчас на форуме: user99, _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+8 невидимых) |
![]() |
eXeL@B —› Основной форум —› Помогите написать программу |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 26 сентября 2005 10:29 · Личное сообщение · #1 Доброго времени всем! Может у кого-нить есть возможность помочь написать программу, желательно на асме. Суть ее в том, чтобы искать значения в файле по определенному правилу. Я попробовал написать на ВБ, но это всё, скорость такая, что просто ужас. Файл 8-10 мб обрабатывается очень долго. А мне зачастую нужно "сканить" большие файлы примерно 100-150Мб. Пробовали ставить эксперимент на Си, обрабатывается 1гиг за 19 секунд. Вот это да, на ВБ про гиг можно забыть - уходит в вечность. Посоветовали обратиться к спецам по асму, говорят что на асме вообще турбо скорость. Пацаны, может поможет кто, а? ![]() |
|
Создано: 26 сентября 2005 10:41 · Личное сообщение · #2 |
|
Создано: 26 сентября 2005 11:57 · Личное сообщение · #3 |
|
Создано: 26 сентября 2005 12:05 · Личное сообщение · #4 ИМХО разницы между Си и АСМ особой не будет, если не применять оброботки с использованием MMX и/или комманд предвыборки. Но многое от алгоритма зависит... Нужна доп. инфомация о задаче. Кстати, а оперативки хватит чтоб файл размера в 1 гбт вмеситить? надо как минимум 1.2 гбт. и замерь сколько времени занимает просто загрузка файла в 1гбт в оперативку. ![]() |
|
Создано: 26 сентября 2005 12:09 · Личное сообщение · #5 |
|
Создано: 26 сентября 2005 12:31 · Личное сообщение · #6 |
|
Создано: 26 сентября 2005 14:07 · Личное сообщение · #7 Нужен хороший алго + FileMapping, если на сях делать, я так в свое время справлялся со скоростью побайтной обработки больших файлов. Может алго был и не лучший, но работало быстро. А чтобы частично файл грузить, можно его разбивать до загрузки в оперативу, потом проецировать уже. А вообще много решений на Си по этому поводу видел на RSDNе. www.rsdn.ru www.rsdn.ru ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 26 сентября 2005 16:12 · Личное сообщение · #8 Это я. Когда тестировался алгоритм на Си, то была использована метода FileMapping. Тот чел, который создавал пример, сказал, что это максимальная скорость, и она ограничена лишь самим считыванием данных с блинов винта. Проц, практически не жрался, только память. Еще немного странно, я перебрал штук 30 различных ХЕкс-редакторов. Но, максимальным быстродействием загрузки и скана больших файлов, похвастал только WinHEX и еще правда один. Как они умудряется мгновенно считывать файл, непонятно, скорее всего они как-то делят файл на куски, делают указатель какбы в памяти, но на самом деле файл находится на диске. Мой алгоритм, в принципе, не сложный. Вот один из примеров: ищем значение, к примеру, FF D8, если, это значение найдено, ставим здесь метку, ищем дальше FF D9, это будет конец искомого файла. Это простейший пример, как найти JPG в неизвестном файле. Размер JPG файла и будет составлять от начала FF D8 до терминатора FF D9. Однако, есть и чуть сложные алгоритмы. Значит, все-таки, вы считаете, что особой разницы между написанием на асме и на си нету? По сути ограничением является лишь скорость чтения по диску. Тогда может кто-нибудь поможет написать прогу на Си? Очень надо. ![]() |
|
Создано: 26 сентября 2005 23:01 · Личное сообщение · #9 |
|
Создано: 26 сентября 2005 23:29 · Личное сообщение · #10 |
|
Создано: 26 сентября 2005 23:39 · Поправил: 4kusNick · Личное сообщение · #11 sergeos Да мы все поможем. Можно прямо тут и влиться в обсуждение. Что именно нужно написать? Алго есть ведь, да? Дык надо только реализовать FileMapping? Если так, то вот пример стандартный: int C***Dlg::FileCode(CString szPath,PBOOL bUnicode) { *bUnicode = FALSE; CWinThread * pThread = AfxGetThread(); MSG msg; int iRet=1; bBrake=false; HANDLE hFile = CreateFile(szPath,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE _ATTRIBUTE_NORMAL,NULL); if (hFile == INVALID_HANDLE_VALUE) { MessageBox(***); iRet=0; return(iRet); } DWORD dwFileSize = GetFileSize(hFile,NULL); HANDLE hFileMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,dwFileSize+sizeof(WCHAR) ,NULL); if (hFileMap == NULL) { MessageBox(***); CloseHandle(hFile); iRet=0; return(iRet); } PVOID pvFile = MapViewOfFile(hFileMap,FILE_MAP_WRITE,0,0,0); if (pvFile == NULL) { MessageBox(***); CloseHandle(hFileMap); CloseHandle(hFile); iRet=0; return(iRet); } int iUnicodeTestFlags = -1; *bUnicode = IsTextUnicode(pvFile, dwFileSize, &iUnicodeTestFlags); PSTR pchANSI = (PSTR) pvFile; pchANSI[dwFileSize / sizeof(CHAR)] = 0; for(int i=dwFileSize-1;i>=0;i--) { //Обработка текста, содержащегося в файле. Он в переменной pchANSI. Байт считать можно по //pchANSI[i] //Эт чтобы прога не висла while (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) if (!pThread->PumpMessage()) break; } UnmapViewOfFile(pvFile); CloseHandle(hFileMap); SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN); SetEndOfFile(hFile); CloseHandle(hFile); return(iRet); } Это очень грубый пример, но он работает. ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 27 сентября 2005 01:26 · Личное сообщение · #12 Максимум где можешь использовать ассемблер это в виде вставок. Но компилятор MSVC++ очень не плохо умеет оптимизировать код(клинические случаи не в счёт). Ara пишет: Гы, причем тут хард, если поиск будет осуществляться все-равно в памяти. Файл нужно считывать в память. Процес поиска в памяти (примитивный) ничто по сравнению с торможением харда. Даже когда ты отображаешь файл, ОС не сразу подгружает все страници памяти, а лишь при обращении к неподкачаным в даный момент. ![]() |
|
Создано: 27 сентября 2005 09:41 · Личное сообщение · #13 Barakuda На счет вставок - согласен, все зависит от алго, иногда рационально вставлять асмовский код, хотя, я очень редко встречал подобного рода использование асма, все вполне грамотно можно реализовать и с помощью сей. Лично мое мнение. ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 27 сентября 2005 10:13 · Поправил: Barakuda · Личное сообщение · #14 4kusNick пишет: все вполне грамотно можно реализовать и с помощью сей. К сожалению не всё. Я тоже так думал, пока не пришлось использовать naked-функции и врезатся в середину кода API ;) Вот и понял простую истину жизни: ассемблер язык НИЗКОГО УРОВНЯ - практически на все случаи. sergeos Тока без фанатизма. То что я только что написал тебя не касается. Реализовывай код на С++ ![]() Прошу прощения за отклонение от темы ![]() |
|
Создано: 27 сентября 2005 12:53 · Личное сообщение · #15 |
|
Создано: 28 сентября 2005 01:25 · Личное сообщение · #16 4kusNick блин, что с ходом работы?... я не смогу осилить ни Си ни Асм. Поэтому пока решался вопрос о создании проги на Си или Асме. Теперь очевидно, что писать, собственно, можно на любом из вышеперечисленных. Возращаясь к истокам темы, интересуюсь, все-таки сможет ли кто-то помочь написать эту софтину? А я уже сделаю детальный поисковый алгоритм. Выручайте, плиз. ![]() |
|
Создано: 28 сентября 2005 03:12 · Личное сообщение · #17 |
|
Создано: 28 сентября 2005 06:50 · Личное сообщение · #18 |
|
Создано: 28 сентября 2005 10:21 · Личное сообщение · #19 4kusNick сорри за неоперативный ответ. в принципе, я всегда в сети, ася: 199630054. просто сегодня работы много было. спасибо за желание помочь. я еще пытался найти на вот этом форуме помощи: www.cbuilder.ru/forums/s=1a106aaf7bfc4174d189f05f6a3df334&act=ST&f=3&t=4904 но там, что-то помыкались, помыкались и забыли про все это. однако, по ходу беседы особого профессионализма тамошних обитателей я не встретил. человек по имени admin пытался помочь, но так и канул в лета. Там я приблизительно изложил весь ход работы, но это только поверхностно. Гляньте плиз... ![]() |
|
Создано: 28 сентября 2005 10:24 · Личное сообщение · #20 вот еще чел пытался делать на сях: // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { HANDLE hFile = CreateFile(L"D:\\Games2\\GTA San Andreas\\models\\gta3.img", FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); LPVOID lpBase = MapViewOfFileEx(hMap, FILE_MAP_READ, 0, 0, 0, NULL); DWORD dwBytesToSearchLength = 2; BYTE bBytesToSearch[] = {0xb9, 0x68}; SYSTEMTIME stime[2]; GetSystemTime(&stime[0]); DWORD dwFileSize = GetFileSize(hFile, NULL); LPBYTE lpb = (LPBYTE)lpBase; int c = 0; for(DWORD i = 0; i < dwFileSize - dwBytesToSearchLength + 1; i++) { if(lpb[i] == bBytesToSearch[0]) { BOOL bFound = TRUE; for(DWORD n=1; n<dwBytesToSearchLength; n++) { if(lpb[i+n] != bBytesToSearch[n]) { bFound = FALSE; break; } if(bFound) c++; } } } GetSystemTime(&stime[1]); FILETIME ftime[2]; SystemTimeToFileTime(&stime[0], &ftime[0]); SystemTimeToFileTime(&stime[1], &ftime[1]); ULARGE_INTEGER uli[2]; uli[0].HighPart = ftime[0].dwHighDateTime; uli[0].LowPart = ftime[0].dwLowDateTime; uli[1].HighPart = ftime[1].dwHighDateTime; uli[1].LowPart = ftime[1].dwLowDateTime; uli[0].QuadPart = (uli[1].QuadPart - uli[0].QuadPart) * 0.0000001; FileTimeToSystemTime(&ftime[0], &stime[0]); UnmapViewOfFile(lpBase); CloseHandle(hMap); CloseHandle(hFile); return 0; } но это только эксперимент был ![]() |
|
Создано: 29 сентября 2005 06:39 · Личное сообщение · #21 |
|
Создано: 30 сентября 2005 04:46 · Личное сообщение · #22 Так-с... Моя ася: 269182762 У меня сейчас тоже с работой перенапряжение, но немного времени бывает... А этот эксперминт нормально работал? А алго лучше полностью заново сделать, наверно. С нуля, так сказать. Есть исходники этого эксперимента? ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 03 октября 2005 10:21 · Личное сообщение · #23 |
|
Создано: 03 октября 2005 15:43 · Личное сообщение · #24 |
|
Создано: 04 октября 2005 00:30 · Личное сообщение · #25 gloom Хорошо. sergeos Я в асе редко сижу, давай здесь все обсуждать дальше. Короче четко сформулируй, какой алго конкретно нужн, что он должен делать и каких размеров предположительно обрабатываемая инфа. И ответь плиз на последнее мое сообщение в этом топике. ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 05 октября 2005 06:08 · Личное сообщение · #26 gloom ок. 4kusNick алго должен быть такой: 1. есть значение, которое нужно найти(т.е. заголовок искомого файла) 2. если значение найдено, выполняется условие 3. при успешном выполнений условий, ищется концовка файла искомого файла. Например, 1. Ищем сигнатуру 42 4D. 2. После 2 байт, 4 байта размер всего файла. 3. Определяем размер всего файла: от найденной сигнатуры + размер. 4. Копируем этот блок в новый файл, желательно, чтоб имя, у вновь созданного файла, содержало оффсет найденного значения(тобишь, в данном случае 42 4D) и оффсет концовки. Т.е. другими словами месторасположение файла в файле, сорри за тафталогию...Например, 523400_1070092.bmp Обрабатываемая инфа обычно метров 100, но может быть и 400-700. ![]() |
|
Создано: 05 октября 2005 09:28 · Личное сообщение · #27 |
|
Создано: 05 октября 2005 10:10 · Личное сообщение · #28 |
|
Создано: 05 октября 2005 14:07 · Личное сообщение · #29 sergeos Так в принципе, чем не устаивает приведенный тобой пример? Открываешь файл, проецируешь, побайтно ищешь, if-else. При верном условии вновь побайтно копируешь в новый файл, только с учетеом найденных байт, Затем снова в тело цикла и так, пока поиск не закончится. Можно попробовать через CString искать, не знаю, быстрее илил медленнее получится, наверно, все-таки помедленнее, можно и так и так попробовать... Пробуй и результаты сюда, если сможешь. Я бы сам мог попробовать все сделать, только времени нет ![]() ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 06 октября 2005 00:41 · Личное сообщение · #30 Для поиска scasw - идеальный вариант А вообще в чём проблема-то? Если CPU не загружается на 100%, то улучшение алгоритма поиска ничего не даст. И, думаю, можно поверить Майкрософт, что CreateFileMapping реализовано очень эффективно. Хотя можно попробовать циклический буффер и ReadFile блоками, кратными 64К - хотя бы память жрать не будет ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Основной форум —› Помогите написать программу |
Эта тема закрыта. Ответы больше не принимаются. |