![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки [D6, WinXP]
anarhi © (2004-08-06 10:52:00)
Привет всем,
проблема такая: есть файл 120 Мбайт (база данных в текстовом виде)читаю определенную часть данных провожу над ними манипуляции, записываю результат в файл, в итоги получается файл такогоже размера, на это уходит 1 час времени и процессор работает на 100%. Как разгрузить процессор и уменьшить время работы, я слышал что-то про потоки и нити а как сделать не знаю подскажите и по подробнее. О разгрузке внутреннего алгоритма речи быть не может. Система Athlon XP 1800+ RAM 384.
WondeRu (2004-08-06 11:54:00) [21]> после того как найду нужную запись из 2 Мбайтного файла
полный атас!!!)
нужная запись ищется случайно не последовательно?
anarhi (2004-08-06 11:53:00) [22]Строки не фиксированной длины.
Digitman (2004-08-06 11:52:00) [23]
> anarhi (06.08.04 11:50) [12]
строки в файле фикс.длины ?
Romkin (2004-08-06 11:52:00) [24]Что-то мне кажется... Ты как в массиве запоминаешь? прояитал строку, увеличил размер массива на 1 элемент, записал? Так?
Тогда все понятно....
Romkin (2004-08-06 11:50:00) [25]Ответ простой: Если есть forms, можно периодически делать Application.ProcessMessages, если нет - периодически sleep(1), к сожалению, sleep(0) не срабатывает. Это просто отдача тактов другим приложениям.
А потоки в таких приложениях - это крайний случай :)
В любом случае, время работы увеличится.
В свое время я обращал матрицу в 80 мегабайт на 386sx33, пользуясь 640 кб памяти. И занимало это примерно час!
Я не могу представить, ЧТО надо считать, чтобы загрузить 1800 Мгц на час... Точнее могу, но здесь явно не это :)))
Скорее всего, не оптимизирована работа с памятью. Чуется мне что-то такое :)
Так что начать надо с этого. И когда время обработки упадет до десяти минут, думаю, сабж отпадет сам собой :)
anarhi (2004-08-06 11:50:00) [26]Digitman,
файл набор текстовых сторок, читаю до определенной сторки при этом строки запоминаю в массиве, в среднем в массиве на каждую запись 40-50 строк. Из другого файла размеров 2 Мбайт надо вставить соответствующию номеру прочитанной записи из 120 Мбайтного файла, строку. Пытался заканчивать цикл оператором break после того как найду нужную запись из 2 Мбайтного файла, не хочет.
WondeRu (2004-08-06 11:48:00) [27]>anarhi (06.08.04 11:37) [6]
под типизированный файл подогнать не удасться?
Digitman (2004-08-06 11:43:00) [28]
> Пытался замямить функцией getmem на весь размер файла
дурней не придумаешь при таком объеме обрабатываемых данных
> Дельфа не может выделить память, кричит об ошибки.
это не Дельфа "кричит" - кричит ОС, а Делфи лишь извещает тебя как посредник, что аппетиты твои в части требуемой тебе вирт.памяти явно неумерены
Smithson (2004-08-06 11:40:00) [29]Перевожу [1]
Если приложение работает "плотно" (100% загрузка проца без просветов), то дополнительные будут его только замедлять, иак как будут бороться с ним за процессор. Поэтому в Вашем случае потоки вредны!
А вот подумать над алгоритмом нужно обязательно. Очень долгий обсчет у Вас получается. Сильное шифрование (ГОСТ 28147 :)) 640 Мег занимает примерно 20 минут - а уж там математики навалом!
Digitman (2004-08-06 11:40:00) [30]
> anarhi (06.08.04 11:37) [6]
приведи его структуру и фрагмент твоего кода, реализующий то что обозначено тобой как "читаю определенную часть данных"
anarhi (2004-08-06 11:40:00) [31]Пытался замямить функцией getmem на весь размер файла Дельфа не может выделить память, кричит об ошибки.
anarhi (2004-08-06 11:37:00) [32]Файл структурирован и очень хорошо.
WondeRu (2004-08-06 11:36:00) [33]Советы:
1. >Erik1 (06.08.04 11:26) [2] Ну да! Создаешь поток для чтения и для записи, можно еще поток для обработки!
2. Используй TFileStream, TMemoryStream! А вообще лучше создавать потомка от TStream для обработки данных, это удобно!
3. Математика только в асме!
Digitman (2004-08-06 11:34:00) [34]
> база данных в текстовом виде
если файл никак не структурирован, то назвать его "базой данных" можно лишь с большой натяжкой
Digitman (2004-08-06 11:33:00) [35]
> О разгрузке внутреннего алгоритма речи быть не может
как раз о ней и речь должна идти
потому что он, скорей всего, работает "в лоб" и никак не оптимизирован
> читаю определенную часть данных
есть большое подозрение, что здесь как раз и есть одно из "узких мест" алгоритма
Erik1 (2004-08-06 11:26:00) [36]Надо замямить фаил данных, будет быстрее читатся. Можно еще оптимизировать преобразования. Возможно попробовать паралельно писать на диск, если обработка долгая то будет выгрыш. Для создания потока посмотри TThread.
Anatoly Podgoretsky (2004-08-06 10:54:00) [37]Не то что не может быть, а просто обязана быть, именно там у тебя проблема. Потоки только увеличат время обработки.