Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.041 c
3-1091168902
som
2004-07-30 10:28
2004.08.22
Про SQL запросы


1-1091605973
Молодой
2004-08-04 11:52
2004.08.22
Почему UpperCase не работает с кирилицой и чем её модно заменить?


3-1091381413
XHelp
2004-08-01 21:30
2004.08.22
Локальная бд


1-1092147415
Alex870
2004-08-10 18:16
2004.08.22
TTreeView


6-1088090396
Dextor
2004-06-24 19:19
2004.08.22
Отправка звука





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский