LINUX.ORG.RU

Константный массив, расшаренный для библиотеки.

 


0

2

liba.so
b.exe
c.exe

b и c грузят (используют через статическую или динамическую загрузку) один и тот же экземпляр библиотеки (т.е. буквально один и тот же файл). Как можно встроенными абсолютно законными средствами линукса (а, главное, с быстрым доступом), расшарить между этими загруженными экземплярами константный массив? Физический файл не подходит - грузить долго, диски медленные, а к этому массиву обращений будет под 10к в секунду с одного приложения. Инициализировать его будет тот, кто самый первый загрузится, время инициализации не критично.

★★

Ответ на: комментарий от no-dashi

А еще варианты есть? Этот метод (posix shared memory) хочет линковку с librt, а у меня 32хбитное приложение. Когда я где-то на x64 прошу протестировать и так приходится ставить 32x битные fontconfig и xlib. Боюсь, что librt просто так на не той архитектуре не заведется.

sambist ★★
() автор топика
Последнее исправление: sambist (всего исправлений: 1)
Ответ на: комментарий от abacaba

И? Каждый раз когда кто-то будет ее цеплять будет создаваться комплект локальных переменных. Запустите 5 программ - увеличите потребление памяти в 5 раз. А я собираюсь увеличить примерно на 60%.

sambist ★★
() автор топика
Ответ на: комментарий от sambist

Память сейчас стоит 3р пучок. Чтобы забить 1 гиг памяти массивом из 1000 uint элементов, тебе нужно будет создать 500.000.000 экземпляров своей .so, т.ч. не парься, грузи всё (массив) из .so шки, она для этого и создана.

menangen ★★★★★
()
Ответ на: комментарий от menangen

Память сейчас стоит 3р пучок.

Я вам свои координаты скажу, а вы мне денег кинете чтобы я купил планку себе и впоследствии каждому, кто будет говорить что у него не хватает памяти.

Каждый раз, когда ты пишешь int i вместо short i, сотни пользователей вынуждены докупать планку памяти.

sambist ★★
() автор топика
Ответ на: комментарий от sambist

Знаешь, а char в C++ ещё меньше чем short int... И там также можно хранить числа.

peregrine ★★★★★
()
Ответ на: комментарий от sambist

И? Каждый раз когда кто-то будет ее цеплять будет создаваться комплект локальных переменных.

не будет

Harald ★★★★★
()
Ответ на: комментарий от Harald

lib:

static int a = 2;

void seta(int value)
{
   a = value;
}

int returna()
{
   return a;
}

// compile as .so

// 1
#include "libh.h"

void main()
{
   seta(5);
}

// 2
#include "libh.h"
#include <stdio.h>

void main()
{
    printf("%d\n", returna());
}
./a1.out
./a2.out

И что выведется?

sambist ★★
() автор топика
Ответ на: комментарий от sambist

Какой связи? Константный - значит немодифицируемый, read-only, лежит в соответствующей секции бинарника и расшаривается между приложениями, слинкованными динамически с этой библиотекой

Harald ★★★★★
()
Ответ на: комментарий от Harald

Я не могу его в бинарник вшить, он в два раза вырастет, его сначала нужно будет заполнить по формулам и после этого его можно будет считать константным.

sambist ★★
() автор топика
Ответ на: комментарий от Harald

Для вас ни в чем, я считаю это проблемой. Это мое ИМХО. Наши мнения расходятся - игнорируйте тред.

sambist ★★
() автор топика
Ответ на: комментарий от sambist

тогда не называй массив константным, используй подходящие термины

Harald ★★★★★
()
Ответ на: комментарий от sambist

Решением твоей проблемы является http://redis.io/, в си массивы нельзя расширять, только если ручным выделением памяти, это уже не совсем массив. Имхо, проблема тса на пустом месте. 1 гиг - это гигантский размер для хранения элементов массива, что там такое пишет тс? Изобретает субд?

menangen ★★★★★
()

Тебе нужен банальнейший mmap.

slovazap ★★★★★
()
Ответ на: комментарий от menangen

что ты имеешь против изобретения субд? Зачем мне тащить в проект redis, если я сам могу написать лучше?

stevejobs ★★★★☆
()
Ответ на: комментарий от sambist

librt входит в состав glibc. Нет таких систем,где 32-разрядный libX11 стоит, а 32-разрядный librt не стоит.

iliyap ★★★★★
()
Ответ на: комментарий от menangen

в си массивы нельзя расширять,

Где ты слово «расширять» увидел?

sambist ★★
() автор топика
Ответ на: комментарий от sambist

Если массив действительно константный, и от запуска к запуску программы содержимое не меняется, то самое логичное - это записать его в файл. Довольно бессмысленно каждый раз рассчитывать его заново, никакого выигрыша это не даёт, ни в использовании памяти, ни в чём.

abacaba
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.