<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Xavier Llorà &#187; tokyo cabinet</title>
	<atom:link href="http://www.xavierllora.net/tag/tokyo-cabinet/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xavierllora.net</link>
	<description>A notebook about data-intensive computing, genetics-based machine learning, semantic-web technology, cloud computing,  and more.</description>
	<lastBuildDate>Thu, 15 Jul 2010 19:50:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Temporary storage for Meandre&#8217;s distributed flow execution</title>
		<link>http://www.xavierllora.net/2009/09/29/temporary-storage-for-meandres-distribute-flow-execution/</link>
		<comments>http://www.xavierllora.net/2009/09/29/temporary-storage-for-meandres-distribute-flow-execution/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 15:14:28 +0000</pubDate>
		<dc:creator>Xavier</dc:creator>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Data-Intensive Computing]]></category>
		<category><![CDATA[data-intensive flows]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[meandre]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[storage]]></category>
		<category><![CDATA[tokyo cabinet]]></category>

		<guid isPermaLink="false">http://www.xavierllora.net/?p=615</guid>
		<description><![CDATA[Designing the distributed execution of a generic Meandre flow involves several moving pieces. One of those is the temporary storage required by the computing nodes (think of it as one node as one isolated component of a flow) to keep up with the data generated by a component, and also be able to replicate such [...]


Related posts:<ol><li><a href='http://www.xavierllora.net/2009/08/13/easy-reliable-and-flexible-storage-for-python/' rel='bookmark' title='Permanent Link: Easy, reliable, and flexible storage for Python'>Easy, reliable, and flexible storage for Python</a></li>
<li><a href='http://www.xavierllora.net/2008/05/22/zookeeper-and-orchestrating-distributed-applications/' rel='bookmark' title='Permanent Link: ZooKeeper and distributed applications'>ZooKeeper and distributed applications</a></li>
<li><a href='http://www.xavierllora.net/2008/04/18/meandre-semantic-driven-data-intensive-flow-engine/' rel='bookmark' title='Permanent Link: Meandre: Semantic-Driven Data-Intensive Flow Engine'>Meandre: Semantic-Driven Data-Intensive Flow Engine</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Designing the distributed execution of a generic Meandre flow involves several moving pieces. One of those is the temporary storage required by the computing nodes (think of it as one node as one isolated component of a flow) to keep up with the data generated by a component, and also be able to replicate such storage to the node containing the consumer to be fed. Such storage, local to each node, must guarantee at least three basic properties.</p>
<ul>
<li>Transaction ready</li>
<li>Light weight implementation</li>
<li>Efficient write and read to minimize the contention on ports</li>
</ul>
<p>Also, it is important to keep in mind that in a distributed execution scenario, each node requires to have its one separated and standalone storage system. Thus, it is also important to minimize the overhead of installation and maintenance of such storage subsystem. There are several alternatives available ranging from traditional relational data base systems to home-brewed solutions. Relational data base systems provide a distributed, reliable, stable, and well tested environment, but they may tend to require a quite involved installation and maintenance. Also, tuning those systems to optimize performance may required quite an involved monitoring and tweaking. On the other hand, home-brewed solutions can be optimized for performance by dropping non required functionality and focussing on writing and reading performance. However, such solutions tend to be bug prone and tend to become time consuming, not to mention that proving transaction correctness can be quite involved.</p>
<p>Fortunately there is a middle ground where efficient and stable transaction aware solutions are available. They may not provide SQL interfaces, but they still provide transaction boundaries. Also, since they are oriented to maximize performance, they can provide better throughput and operation latency than having to traverse the SQL stack. Examples of such storage systems can be found under the areas of key-value stores and column stores. Several options were considered while writing these line, but key-value stores were the ones that better matches the three requirements described above. Several options were informally tested, including solutions like HDF and Berkely DB, however the best performing by far under similar stress test conditions as the sketched temporary storage subsystem was <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a>. I already <a href="/2008/06/05/the-next-generation-of-data-bases/">introduced and <a href="/2009/08/13/easy-reliable-and-flexible-storage-for-python/">tested</a> <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> more than a year ago, but this time I was going to give it a stress test to basically convince myself that that was what I wanted to use for as temporary storage of the distributed flow execution.</p>
<h2>The experiment</h2>
<p>Tokyo cabinet is a collection of storage utilities including, among other facilities, key-value stores implemented as hash files or B-trees and flexible column stores. To illustrate the performance and throughput you can achieve. To implement multiple queues on a single casket (<a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> file containing the data store) B-trees with duplicated keys can help achieving such goal. The duplicated keys are the queue names, and the values are the <a href="http://en.wikipedia.org/wiki/Universally_Unique_Identifier">UUID</a>s of the objects being store. Objects are also stored in the same B-tree by using the <a href="http://en.wikipedia.org/wiki/Universally_Unique_Identifier">UIUD</a> as a key and the value become the payload to store (usually an array of bytes). </p>
<p>Previously, I have been heavily using Python bindings to test <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a>, but this time I went down the Java route (since the Meandre infrastructure is written on Java). The Java bindings are basically build around JNI and statically link to the C version of <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> library, giving away the best of both world. To measure how fast can I write data out of a port into the local storage in a transactional mode, I used the following piece of code.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main <span style="color: #009900;">&#40;</span> <span style="color: #003399;">String</span> args <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> MAX <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10000000</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> inc <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> cnt <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">float</span> fa <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">float</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">8</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> reps <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;=</span>MAX <span style="color: #339933;">;</span> i<span style="color: #339933;">*=</span>inc  <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">//System.out.println(&quot;Size: &quot;+i);</span>
			<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">int</span> j<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span> j<span style="color: #339933;">&lt;</span>reps <span style="color: #339933;">;</span> j<span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	
				<span style="color: #666666; font-style: italic;">//System.out.println(&quot;\tRepetition: &quot;+j);</span>
&nbsp;
				<span style="color: #666666; font-style: italic;">// open the database</span>
				BDB bdb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> BDB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>bdb.<span style="color: #006633;">open</span><span style="color: #009900;">&#40;</span>TEST_CASKET_TCB, BDB.<span style="color: #006633;">OWRITER</span> <span style="color: #339933;">|</span> BDB.<span style="color: #006633;">OCREAT</span> <span style="color: #339933;">|</span> BDB.<span style="color: #006633;">OTSYNC</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000066; font-weight: bold;">int</span> ecode <span style="color: #339933;">=</span> bdb.<span style="color: #006633;">ecode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					fail<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;open error: &quot;</span> <span style="color: #339933;">+</span> bdb.<span style="color: #006633;">errmsg</span><span style="color: #009900;">&#40;</span>ecode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
&nbsp;
				<span style="color: #666666; font-style: italic;">// Add a bunch of duplicates</span>
				<span style="color: #000066; font-weight: bold;">long</span> start <span style="color: #339933;">=</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				bdb.<span style="color: #006633;">tranbegin</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">int</span> k<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> k<span style="color: #339933;">&lt;</span>i<span style="color: #339933;">;</span> k<span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #003399;">String</span> uuid <span style="color: #339933;">=</span> UUID.<span style="color: #006633;">randomUUID</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					bdb.<span style="color: #006633;">putdup</span><span style="color: #009900;">&#40;</span>QUEUE_KEY, uuid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					bdb.<span style="color: #006633;">putdup</span><span style="color: #009900;">&#40;</span>uuid.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, uuid.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
				<span style="color: #009900;">&#125;</span>
				bdb.<span style="color: #006633;">trancommit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				fa<span style="color: #009900;">&#91;</span>cnt<span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span>start<span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #666666; font-style: italic;">// Clean up</span>
				bdb.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">File</span><span style="color: #009900;">&#40;</span>TEST_CASKET_TCB<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			fa<span style="color: #009900;">&#91;</span>cnt<span style="color: #009900;">&#93;</span> <span style="color: #339933;">/=</span> reps<span style="color: #339933;">;</span>
			<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">+</span>i<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">+</span>fa<span style="color: #009900;">&#91;</span>cnt<span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>fa<span style="color: #009900;">&#91;</span>cnt<span style="color: #009900;">&#93;</span><span style="color: #339933;">/</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			cnt<span style="color: #339933;">++;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>The idea is very simple. Just go and star storing 1, 10, 100, 1000, 10000, 1000000, and 10000000 pieces of data at once in a transaction. Measure the time. For each data number repeat the operation 10 times and average the time trying to palliate the fact that the experiment was run on a laptop running all sorts of other concurrent applications. Plot the results to illustrate:</p>
<ol>
<li>time required to insert one piece of data as a function of the number of data involve in the transaction</li>
<li>number of pieces of data wrote per second as a function of the number of data involve in the transaction</li>
</ol>
<p>The idea is to expose the behavior of <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> as more data is involved in a transaction to check if degradation happens as the volume increase. This is an important issue, since data intensive flows can generate large volumes of data per firing event. </p>
<h2>The results</h2>
<p>Results are displayed on the figures below.</p>
<p><a href="http://www.xavierllora.net/wp-content/uploads/2009/09/tc_time.png"><img src="http://www.xavierllora.net/wp-content/uploads/2009/09/tc_time-400x400.png" alt="Time per data unit as a function of number of data involve in a transaction" title="Time per data unit as a function of number of data involve in a transaction" width="300" height="300" /></a><a href="http://www.xavierllora.net/wp-content/uploads/2009/09/tc_throughput.png"><img src="http://www.xavierllora.net/wp-content/uploads/2009/09/tc_throughput-400x400.png" alt="Throughput as a function of number of data in a transaction" title="Throughput as a function of number of data in a transaction" width="300" height="300" /></a></p>
<p>The first important element to highlight is that the time to insert one data element does not degrade as the volume increase. Actually, it is quite interesting that <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> feels more comfortable as the volume per transaction grows. The throughput results are also interesting, since it shows that it is able to sustain transfers of around 40K data units per second, and that the only bottleneck is the disk cache management and bandwidth to the disk itself&#8212;which gets saturated after pushing more than 10K pieces of data.</p>
<h2>The lessons learned</h2>
<p><a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> is a excellent candidate to support the temporary transactional storage required in a distributed execution of a Meandre flow. Other alternatives like <a href="http://www.mysql.com/">MySQL</a>, embedded <a href="http://db.apache.org/derby/">Apache Derby</a>, the <a href="http://www.oracle.com/database/berkeley-db/je/index.html">Java edition of Berkeley DB</a>, <a href="http://www.zentus.com/sqlitejdbc/">SQLite JDBC</a> could not get even get close to such performance falling at least one order of magnitude behind.</p>


<p>Related posts:<ol><li><a href='http://www.xavierllora.net/2009/08/13/easy-reliable-and-flexible-storage-for-python/' rel='bookmark' title='Permanent Link: Easy, reliable, and flexible storage for Python'>Easy, reliable, and flexible storage for Python</a></li>
<li><a href='http://www.xavierllora.net/2008/05/22/zookeeper-and-orchestrating-distributed-applications/' rel='bookmark' title='Permanent Link: ZooKeeper and distributed applications'>ZooKeeper and distributed applications</a></li>
<li><a href='http://www.xavierllora.net/2008/04/18/meandre-semantic-driven-data-intensive-flow-engine/' rel='bookmark' title='Permanent Link: Meandre: Semantic-Driven Data-Intensive Flow Engine'>Meandre: Semantic-Driven Data-Intensive Flow Engine</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.xavierllora.net/2009/09/29/temporary-storage-for-meandres-distribute-flow-execution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Easy, reliable, and flexible storage for Python</title>
		<link>http://www.xavierllora.net/2009/08/13/easy-reliable-and-flexible-storage-for-python/</link>
		<comments>http://www.xavierllora.net/2009/08/13/easy-reliable-and-flexible-storage-for-python/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 22:01:32 +0000</pubDate>
		<dc:creator>Xavier</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[pytc]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tokyo cabinet]]></category>
		<category><![CDATA[tokyo tyrant]]></category>

		<guid isPermaLink="false">http://www.xavierllora.net/?p=573</guid>
		<description><![CDATA[A while ago I wrote a little post about alternative column stores. One that I mentioned was Tokyo Cabinet (and its associated server Tokyo Tyrant. Tokyo Cabinet it is a key-value store written in C and with bindings for multiple languages (including Python and Java). It can maintain data bases in memory or spin them [...]


Related posts:<ol><li><a href='http://www.xavierllora.net/2009/09/29/temporary-storage-for-meandres-distribute-flow-execution/' rel='bookmark' title='Permanent Link: Temporary storage for Meandre&#8217;s distributed flow execution'>Temporary storage for Meandre&#8217;s distributed flow execution</a></li>
<li><a href='http://www.xavierllora.net/2008/07/01/efficient-storage-for-python/' rel='bookmark' title='Permanent Link: Efficient storage for Python'>Efficient storage for Python</a></li>
<li><a href='http://www.xavierllora.net/2008/01/16/a-simple-and-flexible-ga-loop-in-python/' rel='bookmark' title='Permanent Link: A simple and flexible GA loop in Python'>A simple and flexible GA loop in Python</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>A while ago I wrote a little post about <a href="/2008/06/05/the-next-generation-of-data-bases/">alternative column stores</a>. One that I mentioned was <a hef="http://tokyocabinet.sourceforge.net/">Tokyo Cabinet</a> (and its associated server <a href="http://tokyocabinet.sourceforge.net/tyrantdoc/">Tokyo Tyrant</a>. Tokyo Cabinet it is a key-value store written in C and with bindings for multiple languages (including Python and Java). It can maintain data bases in memory or spin them to disk (you can pick between hash or B-tree based stores). </p>
<p>Having heard a bunch of good things, I finally gave it a try. I just installed both Cabinet and Tyrant (you may find useful installation instructions <a href="http://openwferu.rubyforge.org/tokyo.html">here</a> using the usual configure, make, make install cycle). Another nice feature of Tyrant is that it also supports HTTP gets and puts. So having all this said, I just wanted to check how easy it was to use it from Python. And the answer was very simple. <a href="http://github.com/turian/pytc-example/tree/master">Joseph Turian&#8217;s examples</a> got me running in less than 2 minutes&#8212;see the piece of code below&#8212;when dealing with a particular data base. Using Tyrant over HTTP is quite simple too&#8212;see <a href="http://petewarden.typepad.com/searchbrowser/2009/03/tokyo-tyrant-tutorial.html">PeteSearch blog post</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> pytc,<span style="color: #dc143c;">pickle</span>
<span style="color: #ff7700;font-weight:bold;">from</span> numpy <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
hdb = pytc.<span style="color: black;">HDB</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
hdb.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'casket.tch'</span>,pytc.<span style="color: black;">HDBOWRITER</span>|pytc.<span style="color: black;">HDBOCREAT</span><span style="color: black;">&#41;</span>
&nbsp;
a = arange<span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
hdb.<span style="color: black;">put</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'test'</span>,<span style="color: #dc143c;">pickle</span>.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>a<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
b = <span style="color: #dc143c;">pickle</span>.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>hdb.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'test'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>a==b<span style="color: black;">&#41;</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> :
     <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'OK'</span>
hdb.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>



<p>Related posts:<ol><li><a href='http://www.xavierllora.net/2009/09/29/temporary-storage-for-meandres-distribute-flow-execution/' rel='bookmark' title='Permanent Link: Temporary storage for Meandre&#8217;s distributed flow execution'>Temporary storage for Meandre&#8217;s distributed flow execution</a></li>
<li><a href='http://www.xavierllora.net/2008/07/01/efficient-storage-for-python/' rel='bookmark' title='Permanent Link: Efficient storage for Python'>Efficient storage for Python</a></li>
<li><a href='http://www.xavierllora.net/2008/01/16/a-simple-and-flexible-ga-loop-in-python/' rel='bookmark' title='Permanent Link: A simple and flexible GA loop in Python'>A simple and flexible GA loop in Python</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.xavierllora.net/2009/08/13/easy-reliable-and-flexible-storage-for-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
