Thread: c function: keep objects in memory for all session or all transaction
Hi everybody, I am new PostgreSQL c function programmer. I'm trying to move ahead a new "PostgreSQL routing library" (http://www.pgroute.org [for now, the page in only in spanish]). The point: There is some way to keep objects in [persisten] memory and then refer to these from c functions?. In the current version of pgRoute, each transaction load the graph in memory (using MemoryContext), this isn't a enterprise solution for routing program. Why I Wish is using a c function to load the graph in memory [persistent], something like: SELECT pgr_load_graph('my SQL graph sentence', 'graph name'); example: SELECT pgr_load_graph('SELECT id, source, target, cost1,cost2,costn,... FROM edge_table WHERE ...','My graph'); would also have a function to unload or delete. and then, use other function to calculating the shortest path, something like: SELECT pgr_get_shortest_path('from','to','cost column','algorithm','graph name'); example: SELECT pgr_get_shortest_path(6000,5142,'cost1','dijkstra','My graph'); researching in the PostgreSQL source code I found "postgresql-8.4.0/src/backend/utils/mmgr/README.TXT", and I think the indicated MemoryContext that I need to solved my problem is "TopMemoryContext", but I don't found examples of how can I used it. I need some guidelines, or way to resolved this. Is posible to put persisten object in memory through postgresql c funtion?, or my idea is a crazy idea? Thanks a lot for your time and answers, ahhh! and for my English writing.
Re: c function: keep objects in memory for all session or all transaction
From
Peter Eisentraut
Date:
On ons, 2009-09-02 at 10:59 -0430, Christian Gonzalez wrote: > Is posible to put > persisten object in memory through postgresql c funtion? Well, the PL/Perl and PL/Python languages do some variants of this using their GD and SD variables. So it's surely possible in C as well. Memory contexts are the right keyword, but note that if you use TopMemoryContext, you are pretty much just using malloc(). Maybe you want to try prototyping your functionality in PL/Perl or PL/Python to get it started.
On Wed, Sep 2, 2009 at 11:29 AM, Christian Gonzalez<christian.gonzalez@sigis.com.ve> wrote: > The point: > There is some way to keep objects in [persisten] memory and then refer to > these from c functions?. In the current version of pgRoute, each > transaction load the graph in memory (using MemoryContext), this isn't a > enterprise solution for routing program. Why I Wish is using a c function > to load the graph in memory [persistent], something like: Well note that whatever you allocate in TopMemoryContext (or wherever) is going to be private to a single backend. If it's shared data, you probably want to put it in a table, I would think... ...Robert
Peter Eisentraut wrote: > On ons, 2009-09-02 at 10:59 -0430, Christian Gonzalez wrote: > >> Is posible to put >> persisten object in memory through postgresql c funtion? >> > > Well, the PL/Perl and PL/Python languages do some variants of this using > their GD and SD variables. So it's surely possible in C as well. > Memory contexts are the right keyword, but note that if you use > TopMemoryContext, you are pretty much just using malloc(). Maybe you > want to try prototyping your functionality in PL/Perl or PL/Python to > get it started. > > But if you want something visible to all sessions, something like pg_memcache might be what you need. see <http://cvs.pgfoundry.org/cgi-bin/cvsweb.cgi/~checkout~/pgmemcache/pgmemcache/README.pgmemcache?rev=1.11> for some details. cheers andrew
Re: c function: keep objects in memory for all session or all transaction
From
Christian Gonzalez
Date:
Ohh Thanks to all for your answers, pgmemcache does exactly what I need, or how I need it, that is to put my graph into a persistent memory for all transactions that have permissions. Thanks again, Christian Gonzalez El 02/09/09 14:47, Andrew Dunstan escribió: > > > Peter Eisentraut wrote: >> On ons, 2009-09-02 at 10:59 -0430, Christian Gonzalez wrote: >>> Is posible to put persisten object in memory through postgresql c >>> funtion? >> >> Well, the PL/Perl and PL/Python languages do some variants of this using >> their GD and SD variables. So it's surely possible in C as well. >> Memory contexts are the right keyword, but note that if you use >> TopMemoryContext, you are pretty much just using malloc(). Maybe you >> want to try prototyping your functionality in PL/Perl or PL/Python to >> get it started. >> > > > But if you want something visible to all sessions, something like > pg_memcache might be what you need. see > <http://cvs.pgfoundry.org/cgi-bin/cvsweb.cgi/~checkout~/pgmemcache/pgmemcache/README.pgmemcache?rev=1.11> > for some details. > > cheers > > andrew >