Форум: "Основная";
Текущий архив: 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.036 c