Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Потоки   Найти похожие ветки 

 
anarhi   (2004-08-06 10:52) [0]

Привет всем,
проблема такая: есть файл 120 Мбайт (база данных в текстовом виде)читаю определенную часть данных провожу над ними манипуляции, записываю результат в файл, в итоги получается файл такогоже размера, на это уходит 1 час времени и процессор работает на 100%. Как разгрузить процессор и уменьшить время работы, я слышал что-то про потоки и нити а как сделать не знаю подскажите и по подробнее. О разгрузке внутреннего алгоритма речи быть не может. Система Athlon XP 1800+ RAM 384.  


 
Anatoly Podgoretsky ©   (2004-08-06 10:54) [1]

Не то что не может быть, а просто обязана быть, именно там у тебя проблема. Потоки только увеличат время обработки.


 
Erik1   (2004-08-06 11:26) [2]

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


 
Digitman ©   (2004-08-06 11:33) [3]


> О разгрузке внутреннего алгоритма речи быть не может


как раз о ней и речь должна идти
потому что он, скорей всего, работает "в лоб" и никак не оптимизирован


> читаю определенную часть данных


есть большое подозрение, что здесь как раз и есть одно из "узких мест" алгоритма


 
Digitman ©   (2004-08-06 11:34) [4]


> база данных в текстовом виде


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


 
WondeRu ©   (2004-08-06 11:36) [5]

Советы:
1. >Erik1   (06.08.04 11:26) [2] Ну да! Создаешь поток для чтения и для записи, можно еще поток для обработки!
2. Используй TFileStream, TMemoryStream! А вообще лучше создавать потомка от TStream для обработки данных, это удобно!
3. Математика только в асме!


 
anarhi   (2004-08-06 11:37) [6]

Файл структурирован и очень хорошо.


 
anarhi   (2004-08-06 11:40) [7]

Пытался замямить функцией getmem на весь размер файла Дельфа не может выделить память, кричит об ошибки.


 
Digitman ©   (2004-08-06 11:40) [8]


> anarhi   (06.08.04 11:37) [6]


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


 
Smithson ©   (2004-08-06 11:40) [9]

Перевожу [1]
Если приложение работает "плотно" (100% загрузка проца без просветов), то дополнительные будут его только замедлять, иак как будут бороться с ним за процессор. Поэтому в Вашем случае потоки вредны!

А вот подумать над алгоритмом нужно обязательно. Очень долгий обсчет у Вас получается. Сильное шифрование (ГОСТ 28147 :)) 640 Мег  занимает примерно 20 минут - а уж там математики навалом!


 
Digitman ©   (2004-08-06 11:43) [10]


> Пытался замямить функцией getmem на весь размер файла


дурней не придумаешь при таком объеме обрабатываемых данных


> Дельфа не может выделить память, кричит об ошибки.


это не Дельфа "кричит" - кричит ОС, а Делфи лишь извещает тебя как посредник, что аппетиты твои в части требуемой тебе вирт.памяти явно неумерены


 
WondeRu ©   (2004-08-06 11:48) [11]

>anarhi   (06.08.04 11:37) [6]
под типизированный файл подогнать не удасться?


 
anarhi   (2004-08-06 11:50) [12]

Digitman,
файл набор текстовых сторок, читаю до определенной сторки при этом строки запоминаю в массиве, в среднем в массиве на каждую запись 40-50 строк. Из другого файла размеров 2 Мбайт надо вставить соответствующию номеру прочитанной записи из 120 Мбайтного файла, строку. Пытался заканчивать цикл оператором break после того как найду нужную запись из 2 Мбайтного файла, не хочет.


 
Romkin ©   (2004-08-06 11:50) [13]

Ответ простой: Если есть forms, можно периодически делать Application.ProcessMessages, если нет - периодически sleep(1), к сожалению, sleep(0) не срабатывает. Это просто отдача тактов другим приложениям.
А потоки в таких приложениях - это крайний случай :)
В любом случае, время работы увеличится.
В свое время я обращал матрицу в 80 мегабайт на 386sx33, пользуясь 640 кб памяти. И занимало это примерно час!
Я не могу представить, ЧТО надо считать, чтобы загрузить 1800 Мгц на час... Точнее могу, но здесь явно не это :)))
Скорее всего, не оптимизирована работа с памятью. Чуется мне что-то такое :)
Так что начать надо с этого. И когда время обработки упадет до десяти минут, думаю, сабж отпадет сам собой :)


 
Romkin ©   (2004-08-06 11:52) [14]

Что-то мне кажется... Ты как в массиве запоминаешь? прояитал строку, увеличил размер массива на 1 элемент, записал? Так?
Тогда все понятно....


 
Digitman ©   (2004-08-06 11:52) [15]


> anarhi   (06.08.04 11:50) [12]


строки в файле фикс.длины ?


 
anarhi   (2004-08-06 11:53) [16]

Строки не фиксированной длины.


 
WondeRu ©   (2004-08-06 11:54) [17]

> после того как найду нужную запись из 2 Мбайтного файла
полный атас!!!)

нужная запись ищется случайно не последовательно?


 
anarhi   (2004-08-06 11:54) [18]

Rokmin
да так а как по другому?


 
anarhi   (2004-08-06 11:55) [19]

Запись ищется последовательно.


 
Romkin ©   (2004-08-06 11:55) [20]

Да скорее всего каждый раз файл заново читается :)))
http://www.delphimaster.ru/articles/dyntable/index.html
Может, таки не зря это здесь есть?


 
Digitman ©   (2004-08-06 11:56) [21]


> anarhi   (06.08.04 11:53) [16]


чего ж ты тогда лапшу вешаешь, что структурированный он у тебя ?

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


 
Romkin ©   (2004-08-06 11:56) [22]

По-другому - надо брать другие структуры данных. Их полно. Например, тот же TStringList, он заточен под хранение строк


 
Digitman ©   (2004-08-06 11:58) [23]


> Romkin ©   (06.08.04 11:56) [22]


ты сейчас насоветуешь ему) ... надумает загнать все 120 мб в TStringList и получит тот же отлуп , что и при GetMem(120mb)..)


 
Romkin ©   (2004-08-06 11:59) [24]

НУ загнать двухметровый файл в TStringList и отсортировать - примитивно, зато как искать-то будет!


 
Мастер ©   (2004-08-06 12:01) [25]

>anarhi

Ты бы привел куски кода - как ты работаешь с файлами и как идет
работа с данными.


 
WondeRu ©   (2004-08-06 12:03) [26]

создаешь для 2мб файла физическую таблицу (т.е в MS SQL или IB) или вирт. таблицу (TMemoryTable)! Уверяю, это поможет!


 
anarhi   (2004-08-06 12:04) [27]

Сейчас исходников привести немогу я на работе а они дома.


 
anarhi   (2004-08-06 12:05) [28]

WondeRu
а как со 120 Мбайтным?


 
Romkin ©   (2004-08-06 12:08) [29]

>а как со 120 Мбайтным?
Ты его кусками читаешь? Так и читай.
Посмотри TStringList, особенно Names & Values, Sorted и тд.
Наверняка подойдет.


 
WondeRu ©   (2004-08-06 12:10) [30]

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


 
REA ©   (2004-08-06 12:29) [31]

120Мб - маленький файл.


 
anarhi   (2004-08-06 12:30) [32]

REA
ну и как?


 
Digitman ©   (2004-08-06 12:33) [33]


> anarhi   (06.08.04 12:30) [32]



> ну и как?


ты не в цирке и не в богодельне, сударь !

хочешь помощи ? излагай подробно (!!) логику, которая тебе нужна в конечном итоге !


 
anarhi   (2004-08-06 12:35) [34]

Загрузить в память 120 Мбайт и работать с ним как с массивом типа string.


 
Romkin ©   (2004-08-06 12:37) [35]

Абсолютно бессмысленно :)
Ты же можешь поблочно обрабатывать? Зачем извращаться?


 
Мастер ©   (2004-08-06 12:38) [36]

Да зачем тебе все сразу загружать?
Тебе надо загружать последовательно необходимую порцию строк и обрабатывать их. После обработки выводить в другой файл.


 
Smithson ©   (2004-08-06 13:03) [37]

Слушайте, 120 мег - это же смешно. StringList сожрет под него ну максимум 200 мег. Поставь на машину 512 Мег и работай как хочешь! (если оптимизировать не хочешь).



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.054 c
9-1083603796
Bim
2004-05-03 21:03
2004.08.22
Как передать управление процедуре?


14-1091781372
Иксик
2004-08-06 12:36
2004.08.22
Ой мама моя родная, его когда-нибудь переизберут?


6-1087307555
Sadya
2004-06-15 17:52
2004.08.22
Замена части текста при загрузке страниц в IE на другой


1-1091801436
Леонид Федьков
2004-08-06 18:10
2004.08.22
Передача HTML-страницы в TWebBrowser через TOleStream


6-1087902372
w666w
2004-06-22 15:06
2004.08.22
Как написать простейший socks прокси...