![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как пользоваться File Mapping? [D5, MSSQL]
nikolo © (2002-08-05 11:03:00)Проблема в следующем. Есть огровный набор данных в MS SQL 2000, а обрабатывать его нужно в онлайне, т.е. скорость обработки должна быть очень большой. Слышал, что в таких случаях нужно загружать все данные в память и работать соответственно уже с ней. Кажется нужно использовать File Mapping. Подскажите, как именно это делается, желательно с небольшим примером. Пожет в Инете есть ссылки, где можно почитать на эту тему?
Кулюкин Олег (2002-08-07 08:43:00) [21]2 nikolo
> Для чего нужен метод Seek?
Посмотрите хелп, разве там это не описано???
> Есть ли способ поиска без перебора?
Если Вы проиндексируете записи...
Хотя, Вам и я, и другие уже говорили, что не стоит изобретать велосипед и искать геморой
на свою шею.
Проецирование файлов не для этого создавали.
Fiend (2002-08-06 18:04:00) [22]То nikolo ©
Вам действительно верно говорят про изобретение велосипеда.
Надо хорошо спроектировать базу данных.
У меня вот есть система, которая работает с большими таблицами просто мгновенно.
В одной таблице порядка 13 миллионов записей. Запрос к ней выполняется мгновенно. А всё потому что база правильно организована.
И еще: MS SQL достаточно умная машина, чтобы самостоятельно без вас закэшировать данные к которым выполняется частое обращение. На моём сервере 512 Мб мозгов. Таблица с 13 млн. записей весит около 380 Мб. Так вот после первого запроса, сервер без моих на то напоминаний ложит ее в память. И работает всё как по маслу.
Ну а если же вы будете тягать данные к клиенту в память, то не забудьте, что эти данные вам надо будет часто обновлять. И что ж вам опять кучку Мб на коиента тащить?
Это по крайней мере НЕРАЗУМНО.
nikolo (2002-08-06 17:59:00) [23]Перебором я уже сделал примерно так: становишся в начало
Stream.Position := 0;и пока не удовлетворено какое-то условие делаюStream.Read. Тут проблем нет. Но у меня будет очень большой объем данных в памяти, а искать нужно постоянно. Есть ли способ поиска без перебора? Для чего нужен метод Seek?
Может можно использовать как-то указатели?
Кулюкин Олег (2002-08-06 17:53:00) [24]Посмотрите (внимательно посмотрите) пример.
По нему можно слелать поиск.
От перебора вы не избавитесь никак :(
nikolo (2002-08-06 17:37:00) [25]Да, я посмотрел этот пример. Только вот не понял, необходимо что постоянно пользоваться перебором всех записей в памяти, чтобы что-то найти? Нет ли другого способа поиска?
Как нужно использовать метод Seek?
Кулюкин Олег (2002-08-06 13:03:00) [26]Если Вы будете хранить данные с структурах, то пользуйтесь примером из статьи о TSharedStream.
Там есть перебор всех записей, вы можете привернуть туда поиск.
nikolo (2002-08-06 12:03:00) [27]Что скажете?
nikolo (2002-08-06 11:17:00) [28]Да, вы, ребята, все дело говорите, как будто мне вот делать нечего и я просто решил ради развлечения нажить себе геморой.
Если бы речь шла о хранилищах данных типа какого-то склада, учата и всякой такой хрени, то и проблем-то не было бы, но! речь идет о OLPT-системе. Так вот, подсчитайте сколько будет времени уходить на на обработку почти полмиллиона транзакций в день, это же какая очередь будет выстраиваться? Работая же с памятью время обработки можно сократить на порядок.
А вообще, я задал вопрос простой - как работать с памятью, а вы демагогию разводите :) Лучше подскажите все-таки...
Suntechnic (2002-08-05 17:18:00) [29]>nikolo © (05.08.02 11:03)
Слушай DmitryK © он тебе дело говорит и не страдай фигнёй как он же правильно заметил.
Все те вопросы которые у тебя возникли это вопросы созданиясобственной СУБД. Ну и зачем тебе изобретать велосипед если его уже давно изобрели?
Jeer (2002-08-05 17:15:00) [30]Помочь может разделение данных-таблиц по административному признаку.
DmitryK (2002-08-05 16:46:00) [31]А помоему, народ, вы здесь фигней страдете.
СУБД для того и придумывали, что бы с большим объемом данных работать. И 100.000 записей при обработке запросов это далеко не предел.
Правильно спроектируй свою базу, разработай запросы корректно, и выполняться они будут всего 100-200 милисекунд (наиболее частый вариант) вместе с форматированием страниц (HTML).
Можешь еще поговорить с админом своей СУБД, пускай под тебя сервер настроит (например памяти ей больше выделит). Это тоже может помочь.
И даже не думай поднимать всю таблицу в память, у тебя легко могут уйти МИНУТЫ только на подгрузку всей этой информации, а поиск в памяти реализовывать намного сложнее, поиска по СУБД.
Возможно, тот кто тебе советовал работать с данными в памяти, имел ввиду строить временные таблицы в памяти, в таком случае это опять же к твоему админу сервера СУБД.
Кулюкин Олег (2002-08-05 15:50:00) [32]2 nikolo © (05.08.02 15:29)
> Что надо становиться на начало Stream.Position := 0 и дальше
> делать Seek, пока не найду?
Да, вроде того.
Только это неверный подход.
Нехорошщо тащить данные на клиента.
См. Кулюкин Олег © (05.08.02 15:07)
nikolo (2002-08-05 15:29:00) [33]Нужна скорость. В БД может быть и пара миллионов записей, а времени на все про все дается менее секунды. Если есть другое решение этой проблемы - не через потоки - то я с удовольствием хотел бы его услышать :)
Ответьте хоть на последний вопрос:
> Что надо становиться на начало Stream.Position := 0 и дальше
> делать Seek, пока не найду?
Кулюкин Олег (2002-08-05 15:07:00) [34]Может стоит оптимизировать запросы, построить индексы...
Странный подход какой-то. Эмулировать СУБД в потоках
nikolo (2002-08-05 15:06:00) [35]Еще вопрос. Допустим, в память я загнал какой-то select. Нужная строка находится где-то посередине 100000 записей. Как мне ее найти? Что надо становиться на начало
Stream.Position := 0и дальше делать Seek, пока не найду?
nikolo (2002-08-05 13:53:00) [36]Задача такая: в двух словах - обычный online billing, т.е. есть справочник абонентов, справочник устройств, справочник тарифных планов и еще несколько дополнительных справочников. В момент поступления звонка мне нужно быстро определить по справочнику владельца устройства, его тарифный план и т.д. Делать постоянно selectы из БД неприемлемо долго, поэтому и решил использовать память. Вот теперь пытаюсь понять как вся эта кухня работает, т.к. до сего времени с такими задачами не сталкивался.
Читая help по TStream, вроде бы понятно, что надо пользоваться как-то методами Read, Write, Seek. Но как именно и ими ли вообще, пока не понятно. Может все-таки скинете пару строк примера?
Кулюкин Олег (2002-08-05 12:53:00) [37]Хм...
Какая разница откуда берутся данные? Из базы или еще откуда???
Работайте с TSharedStream как с обычным потоком.
Чтобы найти строку, видимо, придется считать разделители строк и выбирать кусок стрима. Все ручами.
Может Вам и не нужен File Mapping?
Расскажите о задаче подробнее.
nikolo (2002-08-05 12:41:00) [38]Да, классный пример! Но не понятно как этим делом пользоваться с БД? Допустим, я с помощью Query1 выбираю данные из Table1, Query2 выбираю данные из Table2 и так далее. Затем записываю данные с помощью TSharedStream в память, а как потом получать конкретные данные? Мне, например, надо вбырать из сохраненной таблицы одну строку, как ее выбрать?
Олег, может ты уже использовал TSharedStream именно с БД, покажи пример.
Кулюкин Олег (2002-08-05 11:25:00) [39]http://www.delphikingdom.com/treasury/sharedstream01.htm