Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2009, 23:04   #1
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Доброе время суток!!!
Нужно большие типизированые файлы обрабатывать в нескольких потоках
для ускорения поиска. Решения нужно зделать на WinApi...
Пробывал ReadFile пороспихивать в потоки, получилось очень нехарашо насколько я понял если файл будет открыт один раз и его дескриптор передан во все потоки то харошего ничего не получится так как функция ReadFile смещает курсор на количество считаных байт.
Из этого возник вопрос, можна ли както сдублировать хендлы файла и передать в потоки?
может есть какие-то иные решения?

Может открывать файл в каждом потоке отдельно?
=================================== =====
Пробывал использовать CreateFile с разными наборами флагов, но чтобы главному потоку дать право чтения+записи а дополнительным только чтения у меня не удалось, получается либо всем чтения либо запись...

Есть хоть какие-то предложения?
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось Stilet; 30.11.2009 в 10:48.
DarkEvil вне форума Ответить с цитированием
Старый 30.11.2009, 08:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а Вы уверены, что овчинка стоит выделки?!
Попробуйте банальнейше скопировать файл (только обязательно обеспечьте, чтобы файл был не в кэше!!! например, перезагрузите компьютер и сразу попробуйте. первый раз он будет не в кэше...)
Засеките время копирования. Вот это то время, которое (теоретически) Вы можете получить в своей программе.
ИМХО, дело в том, что читая файл в разных потоках, прироста скорости Вы не добьётесь!! (если только основное время работы не тратится на обработку считанных данных... тогда да, распараллелить обработку может дать выигрыш в скорости работы программы. Но увеличиться скорость работы программы, а не скорость чтения файла!!!

p.s. всё вышесказанное прошу рассматривать как моё личное непроверенное (и, возможно, ошибочное) мнение...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.11.2009, 10:38   #3
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Собственно, о том что чтения файла в потоках не даст особого выграша в скорости я с Вами согласен, но сам обработка... вот в сам обработчик нам и нужно считать(передать указатель) блок даных, была идея отобразить кусок файла в память, но я ее забраковал...
хоть нынче памят и дешовая но если туда запхайть файлик у 100 мб. ...некрасиво получится
=================================== =======================
Что бы было понятней что я хочу покажу пример:

дупустим мы имеем файл 30 000 записями
поиск обычно работает в цикле от первой до последней записи...
я же хочу розделить эти циклы на несколько частей, пусть каждый обрабатывает по 10 000 записей
и запустить их в дополнительных потоках, вот-это думаю даст значительный прирост в скоросте...
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось DarkEvil; 30.11.2009 в 10:50.
DarkEvil вне форума Ответить с цитированием
Старый 30.11.2009, 10:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если уж невтерпеж читать через потоки, то перед очередным чтением
приостанавливай другие потоки, читающие файлы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.11.2009, 11:07   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а может лишь один поток читать будет? а другим передавать данные на обработку?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.11.2009, 11:12   #6
DarkEvil
Форумчанин
 
Аватар для DarkEvil
 
Регистрация: 08.05.2009
Сообщений: 247
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а может лишь один поток читать будет? а другим передавать данные на обработку?
Соственно по этом вопросу думал, но логеческой синхронизации между всем этим не придумал...

11:14

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если уж невтерпеж читать через потоки, то перед очередным чтением
приостанавливай другие потоки, читающие файлы.
собственно так пока и думаю но у меня не получилось открыть в главном потоке для чтения+записи а в потоках обработки для чтения, получается только для чтения или только для записи... где-то торможу...

Торможение заметно...
Что, опять кнопка "Правка" не видна?
Или правила не для вас писаны?
Мой сайт
Цитата:
Сообщение от Scream In Darkness
Кровь не даёт покоя! Кровь не знает сна!
Кровь бежит на волю – Вены рвёт сама!

Последний раз редактировалось mihali4; 30.11.2009 в 11:36.
DarkEvil вне форума Ответить с цитированием
Старый 30.11.2009, 11:31   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

пусть читает ТОЛЬКО главный поток. а остальным передавайте данные через указатели.и не забывайте указатель после обработки nil'ить(это к вопросу синхронизации)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.11.2009, 12:06   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а в потоках обработки для чтения,
А не проще ли открыть Map-файл в него писать, и с него по указателю считывать в других потоках? Тогда синхронизировать минимум придется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение нескольких записей в TList ? spamer Общие вопросы Delphi 10 30.10.2009 17:07
Чтение из файла. Си. MAKEDON Помощь студентам 1 17.08.2009 16:42
Чтение из файла Amen БД в Delphi 2 09.12.2008 10:40
Чтение файла Stanislav Общие вопросы Delphi 18 24.11.2007 20:45
Чтение из файла Need_Help Паскаль, Turbo Pascal, PascalABC.NET 5 19.05.2007 05:37