Сейчас на форуме: user99, _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+8 невидимых)

 eXeL@B —› Основной форум —› Помогите написать программу
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 26 сентября 2005 10:29
· Личное сообщение · #1

Доброго времени всем!
Может у кого-нить есть возможность помочь написать программу, желательно на асме. Суть ее в том, чтобы искать значения в файле по определенному правилу. Я попробовал написать на ВБ, но это всё, скорость такая, что просто ужас. Файл 8-10 мб обрабатывается очень долго. А мне зачастую нужно "сканить" большие файлы примерно 100-150Мб. Пробовали ставить эксперимент на Си, обрабатывается 1гиг за 19 секунд. Вот это да, на ВБ про гиг можно забыть - уходит в вечность. Посоветовали обратиться к спецам по асму, говорят что на асме вообще турбо скорость. Пацаны, может поможет кто, а?



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

Создано: 26 сентября 2005 10:41
· Личное сообщение · #2

Ты уверен, что хочешь связыватся с ассемблером ?
Доступ к харду на ПОРЯДОК медленней чем к оперативке. Напишы подробней: проблема в алгоритме ?
А что показывает диспетчер задач ? Загрузка на все сто ?
Реализовывать Кнута на асме это не для слабонервных. И за одну секунду всёравно не сделаешь.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 26 сентября 2005 11:57
· Личное сообщение · #3

sergeos пишет:
Доступ к харду на ПОРЯДОК медленней чем к оперативке.

Гы, причем тут хард, если поиск будет осуществляться все-равно в памяти.

sergeos
А что за правила поиска? Реализовать поиск в принципе не трудно, и скорость будет приличная.



Ранг: 42.0 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 26 сентября 2005 12:05
· Личное сообщение · #4

ИМХО разницы между Си и АСМ особой не будет, если не применять оброботки с использованием MMX и/или комманд предвыборки. Но многое от алгоритма зависит... Нужна доп. инфомация о задаче. Кстати, а оперативки хватит чтоб файл размера в 1 гбт вмеситить? надо как минимум 1.2 гбт.
и замерь сколько времени занимает просто загрузка файла в 1гбт в оперативку.




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

Создано: 26 сентября 2005 12:09
· Личное сообщение · #5

а смысл весь файл сразу в оперативную память считывать? это же неразумно




Ранг: 467.7 (мудрец), 5thx
Активность: 0.270
Статус: Участник
Иной :)

Создано: 26 сентября 2005 12:31
· Личное сообщение · #6

Может скажу глупость, но не лучше будет сделать паралельной загрузкой блоков в оперу и пока ищеться в одном блоке грузить следующий блок? Так съэкономить память можно. Не у всех же компов опера по гигу ;)

-----
Computer Security Laboratory





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

Создано: 26 сентября 2005 14:07
· Личное сообщение · #7

Нужен хороший алго + FileMapping, если на сях делать, я так в свое время справлялся со скоростью побайтной обработки больших файлов. Может алго был и не лучший, но работало быстро.
А чтобы частично файл грузить, можно его разбивать до загрузки в оперативу, потом проецировать уже. А вообще много решений на Си по этому поводу видел на RSDNе. www.rsdn.ru www.rsdn.ru

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




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 26 сентября 2005 16:12
· Личное сообщение · #8

Это я. Когда тестировался алгоритм на Си, то была использована метода FileMapping. Тот чел, который создавал пример, сказал, что это максимальная скорость, и она ограничена лишь самим считыванием данных с блинов винта. Проц, практически не жрался, только память. Еще немного странно, я перебрал штук 30 различных ХЕкс-редакторов. Но, максимальным быстродействием загрузки и скана больших файлов, похвастал только WinHEX и еще правда один. Как они умудряется мгновенно считывать файл, непонятно, скорее всего они как-то делят файл на куски, делают указатель какбы в памяти, но на самом деле файл находится на диске. Мой алгоритм, в принципе, не сложный. Вот один из примеров: ищем значение, к примеру, FF D8, если, это значение найдено, ставим здесь метку, ищем дальше FF D9, это будет конец искомого файла. Это простейший пример, как найти JPG в неизвестном файле. Размер JPG файла и будет составлять от начала FF D8 до терминатора FF D9. Однако, есть и чуть сложные алгоритмы.
Значит, все-таки, вы считаете, что особой разницы между написанием на асме и на си нету? По сути ограничением является лишь скорость чтения по диску. Тогда может кто-нибудь поможет написать прогу на Си? Очень надо.



Ранг: 29.0 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 26 сентября 2005 23:01
· Личное сообщение · #9

Читать лучше по секторам, ибо если побайтово то всеравно читается сектор как минимум



Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 26 сентября 2005 23:29
· Личное сообщение · #10

neyron пишет:
Читать лучше по секторам

А как это реализовать? (мысль понравилась, крайне логично)

-----
Подписи - ЗЛО! Нужно убирать!





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

Создано: 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 на закуску.




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

Создано: 27 сентября 2005 01:26
· Личное сообщение · #12

Максимум где можешь использовать ассемблер это в виде вставок. Но компилятор MSVC++ очень не плохо умеет оптимизировать код(клинические случаи не в счёт).

Ara пишет:
Гы, причем тут хард, если поиск будет осуществляться все-равно в памяти.

Файл нужно считывать в память. Процес поиска в памяти (примитивный) ничто по сравнению с торможением харда. Даже когда ты отображаешь файл, ОС не сразу подгружает все страници памяти, а лишь при обращении к неподкачаным в даный момент.




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

Создано: 27 сентября 2005 09:41
· Личное сообщение · #13

Barakuda
На счет вставок - согласен, все зависит от алго, иногда рационально вставлять асмовский код, хотя, я очень редко встречал подобного рода использование асма, все вполне грамотно можно реализовать и с помощью сей. Лично мое мнение.

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




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

Создано: 27 сентября 2005 10:13 · Поправил: Barakuda
· Личное сообщение · #14

4kusNick пишет:
все вполне грамотно можно реализовать и с помощью сей.

К сожалению не всё.
Я тоже так думал, пока не пришлось использовать naked-функции и врезатся в середину кода API ;)
Вот и понял простую истину жизни: ассемблер язык НИЗКОГО УРОВНЯ - практически на все случаи.

sergeos Тока без фанатизма. То что я только что написал тебя не касается. Реализовывай код на С++

Прошу прощения за отклонение от темы




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

Создано: 27 сентября 2005 12:53
· Личное сообщение · #15

Barakuda
Ну, новичку можно и все с помощью сей делать, т.е. без вставок. Для начала лучше не париться, а на счет асма - я полностью согласен - язык почти что универсальный.
sergeos
Ну что там с ходом работы?

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




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 28 сентября 2005 01:25
· Личное сообщение · #16

4kusNick
блин, что с ходом работы?... я не смогу осилить ни Си ни Асм. Поэтому пока решался вопрос о создании проги на Си или Асме. Теперь очевидно, что писать, собственно, можно на любом из вышеперечисленных. Возращаясь к истокам темы, интересуюсь, все-таки сможет ли кто-то помочь написать эту софтину? А я уже сделаю детальный поисковый алгоритм. Выручайте, плиз.




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

Создано: 28 сентября 2005 03:12
· Личное сообщение · #17

sergeos
Я могу помочь, все зависит от алгоритма и сложности проекта.
Лучше для начала реализовать на сях, имхо проще будет, а потом на асм переписать.

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





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

Создано: 28 сентября 2005 06:50
· Личное сообщение · #18

sergeos
Я не слышу твоих предложений, нужно еще или нет?
Если действительно нужно, пиши на мыло 4kusNick@revenge-crew.com помогу, чем смогу, а лучше здесь все выкладывай, тут коллектив поможет.

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




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 28 сентября 2005 10:21
· Личное сообщение · #19

4kusNick
сорри за неоперативный ответ. в принципе, я всегда в сети, ася: 199630054. просто сегодня работы много было. спасибо за желание помочь. я еще пытался найти на вот этом форуме помощи: www.cbuilder.ru/forums/s=1a106aaf7bfc4174d189f05f6a3df334&act=ST&f=3&t=4904 но там, что-то помыкались, помыкались и забыли про все это. однако, по ходу беседы особого профессионализма тамошних обитателей я не встретил. человек по имени admin пытался помочь, но так и канул в лета. Там я приблизительно изложил весь ход работы, но это только поверхностно. Гляньте плиз...



Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 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.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 29 сентября 2005 06:39
· Личное сообщение · #21

4kusNick
Дружище фокусник. Ты сам-то куда пропал? Видел, я тут немного инфы привел, что-нить есть полезного? Или может полностью алгоритм сделать, а? пиши, не пропадай.




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

Создано: 30 сентября 2005 04:46
· Личное сообщение · #22

Так-с... Моя ася:
269182762
У меня сейчас тоже с работой перенапряжение, но немного времени бывает...

А этот эксперминт нормально работал?

А алго лучше полностью заново сделать, наверно. С нуля, так сказать.
Есть исходники этого эксперимента?

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




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 03 октября 2005 10:21
· Личное сообщение · #23

4kusNick
Ты где пропал? Стучу тебе в асю, никто не открывает. Попробуй сам 199630054



Ранг: 192.3 (ветеран), 18thx
Активность: 0.120
Статус: Участник
stoned machine-gunner

Создано: 03 октября 2005 15:43
· Личное сообщение · #24

sergeos
4kusNick
Для личных сообщений есть специальная кнопка, используйте её пожалуйста!

-----
once you have tried it, you will never want anything else





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

Создано: 04 октября 2005 00:30
· Личное сообщение · #25

gloom
Хорошо.
sergeos
Я в асе редко сижу, давай здесь все обсуждать дальше.
Короче четко сформулируй, какой алго конкретно нужн, что он должен делать и каких размеров предположительно обрабатываемая инфа.
И ответь плиз на последнее мое сообщение в этом топике.

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




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 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.




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

Создано: 05 октября 2005 09:28
· Личное сообщение · #27

Такс... Надо подумать с этим всем. Если найденных значений несколько?
Попытаюсь навалять что-нить на скорую руку, т.к. времени мало, но чем смогу - тем помогу.

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




Ранг: 29.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 05 октября 2005 10:10
· Личное сообщение · #28

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




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

Создано: 05 октября 2005 14:07
· Личное сообщение · #29

sergeos
Так в принципе, чем не устаивает приведенный тобой пример?
Открываешь файл, проецируешь, побайтно ищешь, if-else.
При верном условии вновь побайтно копируешь в новый файл, только с учетеом найденных байт, Затем снова в тело цикла и так, пока поиск не закончится.
Можно попробовать через CString искать, не знаю, быстрее илил медленнее получится, наверно, все-таки помедленнее, можно и так и так попробовать... Пробуй и результаты сюда, если сможешь.
Я бы сам мог попробовать все сделать, только времени нет

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




Ранг: 12.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 06 октября 2005 00:41
· Личное сообщение · #30

Для поиска scasw - идеальный вариант
А вообще в чём проблема-то? Если CPU не загружается на 100%, то улучшение алгоритма поиска ничего не даст. И, думаю, можно поверить Майкрософт, что CreateFileMapping реализовано очень эффективно.
Хотя можно попробовать циклический буффер и ReadFile блоками, кратными 64К - хотя бы память жрать не будет


. 1 . 2 . >>
 eXeL@B —› Основной форум —› Помогите написать программу
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати