Are you sure you cache needs to grow endlessly? Otherwise you could use RequestAddinShmemSpace and manage you're map within that space, perhaps "overwriting" chunks on an LRU basis or a rollover. i.e. Grab it all and do your own management within that single block of shmem. Caches are best for thing revisited often, so old/unused ought to be expendable with little performance loss, at least compared with the heavy traffic.
On 10/20/2010 05:44 PM, Gabi Julien wrote: > Hi, > > Here is my problem: I have a postgresql C function that looks like this: > > Datum filter(PG_FUNCTION_ARGS); > > It takes identifiers and queries a bunch of tables and ends up returning true > or false. So far nothing difficult except that we want better performance. > The function was already optimized to the best of my abilities and changing > the structure of the database would not help. However, having a cache would > be the perfect solution. I could implement this cache outside of postgresql > if need be but nothing could beat implementing this directly in a postgresql > C function. > > So this is what I want, a custom cache built into a postgresql C function. > Since postgresql uses different processes, it would be best to use the shared > memory. Can this be done safely? At its core, the cache could be considered > as simple as a map protected by a mutex. With postgresql, I first need to > initialized some shared memory. This is explained at the end of this link: > > http://www.postgresql.org/docs/8.2/static/xfunc-c.html > > However, it sounds like I need to reserve the shared memory in advance using: > > void RequestAddinShmemSpace(int size) > > In my case, I do not know how big my cache will be. I would preferably > allocate the memory dynamically. Is this possible? In any case, am I trying > to reinvent the wheel here? Is there already a shared map or a shared hash > structure available in postgresql? > > If shared memory turns out too difficult to use, I could create separate > caches for each postgresql processes. This would be a waste of space but it > might be better then nothing. In this case, do I need to make my code thread > safe? In other words, is postgresql using more then one thread per processes? > > Any insights would be more then welcome! > Thank you, > Gabi Julien > -- Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general