Очень большие массивы
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
Очень большие массивы
Возникла проблема: в программе надо использовать массивы размером больше, чем 4GB.
Напрашивающееся решение - создать библиотеку, которая через memory-mapped files будет хранить массив на диске и по мере надобности подмонтировать нужные секции в память.
Нужен совет вот по каким вопросам:
1. Есть ли какие-то подводные камни в этом подходе?
2. Нет ли уже написанной библиотеки?
П.С. Платформа - Win32.
Напрашивающееся решение - создать библиотеку, которая через memory-mapped files будет хранить массив на диске и по мере надобности подмонтировать нужные секции в память.
Нужен совет вот по каким вопросам:
1. Есть ли какие-то подводные камни в этом подходе?
2. Нет ли уже написанной библиотеки?
П.С. Платформа - Win32.
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Re: Очень большие массивы
Это всё связано с ограничением Win32 на память, доступную процессу?
Встречный вопрос - "хранить на диске" значит только во время работы программы или в самом деле "хранить"?
Если только хранить на время работы программы, то какой ожидается размер одного элемента массива?
Есть ещё такое подозрение, подойдёт vector из stl. Надо подкрутить: allocator для этого vector, чтобы мог выделять память из memory-mapped files, то есть за пределами доступной процессу.. Примеров в сети на аллокаторы - много.
Встречный вопрос - "хранить на диске" значит только во время работы программы или в самом деле "хранить"?
Если только хранить на время работы программы, то какой ожидается размер одного элемента массива?
Есть ещё такое подозрение, подойдёт vector из stl. Надо подкрутить: allocator для этого vector, чтобы мог выделять память из memory-mapped files, то есть за пределами доступной процессу.. Примеров в сети на аллокаторы - много.
Последний раз редактировалось Woozy 05 апр 2004, 08:53, всего редактировалось 2 раза.
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Re: Очень большие массивы
А че б не использовать базу данных и хранить всю эту фигню в таблице?aldep писал(а):Возникла проблема: в программе надо использовать массивы размером больше, чем 4GB.
Напрашивающееся решение - создать библиотеку, которая через memory-mapped files будет хранить массив на диске и по мере надобности подмонтировать нужные секции в память.
Нужен совет вот по каким вопросам:
1. Есть ли какие-то подводные камни в этом подходе?
2. Нет ли уже написанной библиотеки?
П.С. Платформа - Win32.
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
Re: Очень большие массивы
Да.Woozy писал(а):Это всё связано с ограничением Win32 на память, доступную процессу?
Только на время работы.Woozy писал(а): Встречный вопрос - "хранить на диске" значит только во время работы программы или в самом деле "хранить"?
Если только хранить на время работы программы, то какой ожидается размер одного элемента массива?
Размер одного элемента массива обычно double, но может быть и небольшая не больше килобайта строка.
Вообще идея интересная, спасибо, посмотрю, единственное что смущает - производительность. Динамический массив нам не нужен. Размер данных известен заранее и он не изменяется.Woozy писал(а): Есть ещё такое подозрение, подойдёт vector из stl. Надо подкрутить: allocator для этого vector, чтобы мог выделять память из memory-mapped files, то есть за пределами доступной процессу.. Примеров в сети на аллокаторы - много.
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Re: Очень большие массивы
А для vector можно зарезервировать сразу сколько надо элементов и операции по изменению его размера задействованы не будут, до следующего явного изменения размера или при попытке создать больше элементов.aldep писал(а): Вообще идея интересная, спасибо, посмотрю, единственное что смущает - производительность. Динамический массив нам не нужен. Размер данных известен заранее и он не изменяется.
Последний раз редактировалось Woozy 05 апр 2004, 09:03, всего редактировалось 2 раза.
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
Re: Очень большие массивы
Хранится как раз все это в базе данных.Vovchik писал(а): А че б не использовать базу данных и хранить всю эту фигню в таблице?
Проблема в том, что приходится многократно проходить этот массив и изменять его, создавать новые таблицы, и если все хранить в базе, то производительность, по сравнению к доступу из памяти, падает в ~20 раз. Поэтому мы загружали всю таблицу в память, но ее стало не хватать.

- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
Re: Очень большие массивы
Да я знаю, поэтому то идея и интересная, боюсь только доступ к вектору векторов будет медленный (нам нужны именно табличные данные.Woozy писал(а): А для vector можно зарезервировать сразу сколько надо элементов и ни операции по изменению его размера задействованы не будут, до следующего явного изменения размера или при попытке создать больше элементов.
Ты не встречал примеры таких аллокаторов?
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Re: Очень большие массивы
1. Самое значительное время будет тратиться на операции чтения-записи в-из memory-mapped file. STL-ный overhead будет незначительный, если память заранее выделена.aldep писал(а): Да я знаю, поэтому то идея и интересная, боюсь только доступ к вектору векторов будет медленный (нам нужны именно табличные данные.
Ты не встречал примеры таких аллокаторов?
2. Встречал. Писал, правда вовсе другой allocator. Из интереса покопаю google когда будет лишних 15 мин.
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Re: Очень большие массивы
Тыда надо таблицу разбить по кускам. Типа - партишн как в Оракле. Ты ж все равно будешь читать писать в файлы. ТО что ты хочешь - это как раз Оракловая партишен таблица, сдается мне.aldep писал(а):Хранится как раз все это в базе данных.Vovchik писал(а): А че б не использовать базу данных и хранить всю эту фигню в таблице?
Проблема в том, что приходится многократно проходить этот массив и изменять его, создавать новые таблицы, и если все хранить в базе, то производительность, по сравнению к доступу из памяти, падает в ~20 раз. Поэтому мы загружали всю таблицу в память, но ее стало не хватать.
А ежели Оракл сидит на Шмуниксе, и там типа хорошо покрутить всякие гайки - то приблизительно мона добиться чтоб ваще вся таблица (или куски) торчали в памяти на сервере и свести ввод вывод на диск к минимуму.
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
Re: Очень большие массивы
1. Если подсоединять секции по паре десятков Мб то ИО не должен быть узким местом.Woozy писал(а):aldep писал(а): 1. Самое значительное время будет тратиться на операции чтения-записи в-из memory-mapped file. STL-ный overhead будет незначительный, если память заранее выделена.
2. Встречал. Писал, правда вовсе другой allocator. Из интереса покопаю google когда будет лишних 15 мин.
2. Покопай, если сможешь, буду признателен. Кстати, если я правильно понимаю, то надо будет также переписывать сам вектор тоже, он должен обрабатывать ситуацию, когда нужный элемент выгружен на диск.
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
Re: Очень большие массивы
База может находится на другой машине, и кстати она совсем не обязательно в Оракле. Очень часто она в SAS файле, так как Оракл не поддерживает больше 1К столбцов.Vovchik писал(а):Тыда надо таблицу разбить по кускам. Типа - партишн как в Оракле. Ты ж все равно будешь читать писать в файлы. ТО что ты хочешь - это как раз Оракловая партишен таблица, сдается мне.aldep писал(а):Хранится как раз все это в базе данных.Vovchik писал(а): А че б не использовать базу данных и хранить всю эту фигню в таблице?
Проблема в том, что приходится многократно проходить этот массив и изменять его, создавать новые таблицы, и если все хранить в базе, то производительность, по сравнению к доступу из памяти, падает в ~20 раз. Поэтому мы загружали всю таблицу в память, но ее стало не хватать.
А ежели Оракл сидит на Шмуниксе, и там типа хорошо покрутить всякие гайки - то приблизительно мона добиться чтоб ваще вся таблица (или куски) торчали в памяти на сервере и свести ввод вывод на диск к минимуму.
Запрос к memory mapped файлу гораздо быстрее чем запрос к серверу БД, даже если он на той же машине.
Время на создание и заплонение такого файла небольшое по сравнению с временем вычислений. Кроме того, как я сказал, данные надо изменять, поэтому на сервере все равно надо создавать временную таблицу.
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Re: Очень большие массивы
Я не нашёл в точности того метода, о котором писал, но вот, тоже решение: http://www.garret.ru/~knizhnik/post.htmlaldep писал(а):2. Покопай, если сможешь, буду признателен. Кстати, если я правильно понимаю, то надо будет также переписывать сам вектор тоже, он должен обрабатывать ситуацию, когда нужный элемент выгружен на диск.
Как понимаю, persistent так же будет решением для невообразимо огромных массивов.
-
- Частый Гость
- Сообщения: 23
- Зарегистрирован: 26 фев 2003, 15:01
- Откуда: Toronto
А как mapped memory file решает проблему?
Исходная проблема ведь заключается в отсутствии механизма адресации памяти свыше 4гб, как только замэпишь
файл в память, получишь доступ только к его 4 гб от начала
(а еще точнее 2гб - пользовательские), так?
ИМХО копать надо в построение механизма адресации
с 64разрядными адресами, и его мэппинга на 32 разрядные.
Я одно время интересовался, но не получив зеленого света от начальства, бросил, даже не начав
А было бы интересно,
действительно.
Идея с базой данных вполне живая, имхо.
Там все эти проблемы в полный рост, и уже решены.
Д.
Исходная проблема ведь заключается в отсутствии механизма адресации памяти свыше 4гб, как только замэпишь
файл в память, получишь доступ только к его 4 гб от начала
(а еще точнее 2гб - пользовательские), так?
ИМХО копать надо в построение механизма адресации
с 64разрядными адресами, и его мэппинга на 32 разрядные.
Я одно время интересовался, но не получив зеленого света от начальства, бросил, даже не начав

действительно.
Идея с базой данных вполне живая, имхо.
Там все эти проблемы в полный рост, и уже решены.
Д.
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
dEBUGER писал(а):А как mapped memory file решает проблему?
Код: Выделить всё
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh, // 32 bit +
DWORD dwFileOffsetLow, // 32 bit
SIZE_T dwNumberOfBytesToMap
);
-
- Пользователь
- Сообщения: 113
- Зарегистрирован: 24 сен 2003, 21:52
Re: Очень большие массивы
[trn]V Vin32 adresnoe prostranstvo processa 2Gb. (3Gb v Advanced Server). Kak ne kruti, bol'she v pamjat' ne vpihnesh. Hranit' 2-h Gb sekcii na diske mozhno. Esli u tebja posledovatel'nyj dostup. Esli dostup vraznoboj, to peremaplen'ja sozhrut ves' performans.aldep писал(а):Возникла проблема: в программе надо использовать массивы размером больше, чем 4GB.
Напрашивающееся решение - создать библиотеку, которая через memory-mapped files будет хранить массив на диске и по мере надобности подмонтировать нужные секции в память.
Нужен совет вот по каким вопросам:
1. Есть ли какие-то подводные камни в этом подходе?
2. Нет ли уже написанной библиотеки?
П.С. Платформа - Win32.
[/trn]