
<?phpxml 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/"
>
<channel>
<title>TheGridPlace - For all your Grid and DataGrid Information / Published</title>
<link>http://smetube.com/TheGridPlace</link>
<description>TheGridPlace - For all your Grid and DataGrid Information  votes</description>
<pubDate>Fri, 30 Jul 2010 08:00:07 CDT</pubDate>
<language>en</language>
<item>
<title><![CDATA[Vanderbilt HPC Center to Add GPU Cluster
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Vanderbilt-HPC-Center-to-Add-GPU-Cluster</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Vanderbilt-HPC-Center-to-Add-GPU-Cluster</comments>
<pubDate>Fri, 30 Jul 2010 08:00:07 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Vanderbilt-HPC-Center-to-Add-GPU-Cluster</guid>
<description><![CDATA[University opts for GPGPU technology to support scientific research.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Intel Demos 50 Gbps Silicon Photonics Prototype
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Intel-Demos-50-Gbps-Silicon-Photonics-Prototype</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Intel-Demos-50-Gbps-Silicon-Photonics-Prototype</comments>
<pubDate>Wed, 28 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Intel-Demos-50-Gbps-Silicon-Photonics-Prototype</guid>
<description><![CDATA[Chip maker aims to revolutionize computing with integrated photonics devices.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Processor Cycles for Free
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Processor-Cycles-Free</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Processor-Cycles-Free</comments>
<pubDate>Tue, 27 Jul 2010 08:00:09 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Processor-Cycles-Free</guid>
<description><![CDATA[Share of compute cycles from GPUs dwarfs contribution from x86 CPUs.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[YeSQL (part II) - Putting NoSQL, SQL and Document Model Together
		]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=YeSQL-part-II-Putting-NoSQL-SQL-Document-Model-Together</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=YeSQL-part-II-Putting-NoSQL-SQL-Document-Model-Together</comments>
<pubDate>Sun, 25 Jul 2010 08:00:01 CDT</pubDate>
<dc:creator></dc:creator>
<category>GigaSpaces</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=YeSQL-part-II-Putting-NoSQL-SQL-Document-Model-Together</guid>
<description><![CDATA[In my previous post (YeSQL: An Overview of the Various Query Semantics in the Post Only-SQL World ) I introduced the common query semantics in the post Only-SQL world and made an argument that the right approach is to decouple...<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[It's Maps all the way down
         ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Its-Maps-all-way-down</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Its-Maps-all-way-down</comments>
<pubDate>Sat, 24 Jul 2010 08:00:25 CDT</pubDate>
<dc:creator></dc:creator>
<category>Tangasol / Oracle</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Its-Maps-all-way-down</guid>
<description><![CDATA[ From &quot;A Brief History of Time&quot;:    A well-known scientist (some say it was Bertrand Russell) once gave a public lecture on astronomy. He described how the earth orbits around the sun and how the sun, in turn, orbits around the center of a vast collection of stars called our galaxy. At the end of the lecture, a little old lady at the back of the room got up and said: &quot;What you have told us is rubbish. The world is really a flat plate supported on the back of a giant tortoise.&quot; The scientist gave a superior smile before replying, &quot;What is the tortoise standing on?&quot; &quot;You're very clever, young man, very clever&quot;, said the old lady. &quot;But it's turtles all the way down!&quot;    Coherence uses a analogous architecture, but replace &quot;turtle&quot; in the above story with &quot;Java Map interface&quot;. For example, a common use case is to cache a limited amount of data in an application server tier, backed by an In-Memory Data Grid (IMDG). The topology for this use case is referred to as &quot;size-limited near caching with a partitioned cache&quot;; in other words, the application server uses a  near cache  to keep recently- and commonly-used data locally in memory, while the entire data set (up to a few terabytes) is cached by the In-Memory Data Grid. Coherence, as an IMDG, automatically partitions all of the data across the available  cache servers  (aka  storage-enabled nodes ).   In this scenario, the cache that is being used on the application server is a Java Map, implemented by Near Cache. The Near Cache is backed by two Java Maps: The first is an in-memory size-limited Java Map (where the &quot;near&quot; data gets stored), implemented by Local Cache, and the second is the partitioned Java Map, implemented by Partitioned Cache Service. The partitioned Map is actually a thin ClassLoader-aware veneer that handles serialization and deserialization, and delegates to an underlying binary-only Java Map, also implemented by Partitioned Cache Service. The binary implementation uses TCMP messaging to communicate across the cluster to the server(s) that own the partition(s) involved with a given client-side operation. When an operation request is received by one of those servers, it is translated into an invocation against a member-specific Java Map, implemented by the Storage module of the Partitioned Cache Service. That invocation is then typically delegated to a multiplexing Java Map, implemented by a Partition-Aware Backing Map (PABM). The invocation is then delivered to an actual data-managing Java Map, which is the  backing map  that was configured for that cache. The backing map may in turn be composed of a sequence and/or tree of delegating maps, such as when the cache is backed by a database; in this case, the backing map is a database-aware Java Map, implemented by Read/Write Backing Map (RWBM). The Read/Write Backing Map will store cache data in memory by delegating to a configured backing Java Map, implemented for example by a Local Cache or a thread-safe Hash Map. (There are even more turtles than this, since there are fault-tolerant &quot;safe&quot; layers, the option for client/server proxy layers, client- and subject-specific security layers, and &quot;backup&quot; redundancy layers.)   All in all, Coherence contains roughly 80 Map extensions and implementations, and a few dozen more in the unit and functional tests packages. Many of the early Map implementations in Coherence were based on the AbstractMap implementation that was part of the Java Collections framework, but AbstractMap turned out to be a rather poor base class for Map implementations for a number of reasons, including:     At first glance, AbstractMap implements everything except for one method. Unfortunately, that one method is  entrySet() , which means that instead of implementing a Map of keys to values (which makes sense), you have to implement a Set of key/value (&quot;Entry&quot;) pairs (which doesn't typically make sense).     In most cases, you manage the internal data structures by key, not by entry, so you end up overriding the  keySet()  implementation with a custom key set, and writing an  entrySet()  implementation that delegates back to the Map methods themselves or to the key set.     The AbstractMap method implementations all delegate to the Entry Set, so simple operations such as  isEmpty() ,  size() ,  remove  and even  get()  iterate through the entries -- typically, in most cases iterating through  all  of the entries! To create an efficient Map implementation, you thus have to override most of the concrete implementations from AbstractMap. Furthermore, if you implement the  entrySet()  as describe above, the Map methods must be overridden to avoid infinite recursion.     As a result, in many cases AbstractMap ends up providing only a handy implementation of  hashCode() ,  toString()  and  equals() . To help address this, Coherence provides two abstract Map implementations:     When a Map knows all of its keys, i.e. when a Map has a data structure that contains all of its keys, then it should extend  AbstractKeySetBasedMap .     When a Map doesn't hold all of its keys in a data structure, then it should extend  AbstractKeyBasedMap . A good example of this is when the keys and values are stored on disk or in another system, or in another Map that is delegated to, and thus the delegating Map implementation does not have to store all of the keys redundantly.     In both cases, the  keySet() ,  entrySet()  and  values()  methods are implemented by the abstract class, and typically do not have to be overridden. To override any of them, there is a standard inner class factory pattern that allows sub-classes to override the  KeySet ,  EntrySet  and  ValuesCollection  inner classes, for example:    protected Set &amp;gt; instantiateEntrySet()    Like AbstractMap, a number of methods are implemented, but should generally be overridden for efficiency purposes. For example, implementations extending  AbstractKeyBasedMap  should implement and/or override the following methods:    /*** Create an iterator over the keys in this Map. The Iterator must* support remove() if the Map supports removal.** @return a new instance of an Iterator over the keys in this Map*/protected abstract Iterator&amp;lt;K&amp;gt; iterateKeys(); /*** Returns the value to which this map maps the specified key.** @param oKey the key object** @return the value to which this map maps the specified key,* or null if the map contains no mapping for this key*/public abstract V get(Object oKey); /*** Associates the specified value with the specified key in this map.** @param oKey key with which the specified value is to be associated* @param oValue value to be associated with the specified key** @return previous value associated with specified key, or &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt;* if there was no mapping for key*/public V put(K oKey, V oValue) { throw new UnsupportedOperationException(); } /*** Removes the mapping for this key from this map if present.** @param oKey key whose mapping is to be removed from the map** @return previous value associated with specified key, or &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt;* if there was no mapping for key. A &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; return can* also indicate that the map previously associated &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt;* with the specified key, if the implementation supports* &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; values.*/public V remove(Object oKey) { throw new UnsupportedOperationException(); } /*** Returns the number of key-value mappings in this map.** @return the number of key-value mappings in this map*/public int size() { // this begs for sub-class optimization int c = 0; for (Iterator iter = iterateKeys(); iter.hasNext(); ) { iter.next(); ++c; } return c; } /*** Returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if this map contains a mapping for the specified* key.** @return &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if this map contains a mapping for the specified* key, &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.*/public boolean containsKey(Object oKey) { // this begs for sub-class optimization for (Iterator iter = iterateKeys(); iter.hasNext(); ) { if (equals(oKey, iter.next())) { return true; } } return false; }    Additionally, depending on the implementation, it may make sense to override a few additional methods:    /*** Clear all key/value mappings.*/public void clear() { // this begs for sub-class optimization for (Iterator iter = iterateKeys(); iter.hasNext(); ) { iter.next(); iter.remove(); } } /*** Returns &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if this map contains no key-value mappings.** @return &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if this map contains no key-value mappings*/public boolean isEmpty() { return size() == 0; } /*** Removes the mapping for this key from this map if present. This method* exists to allow sub-classes to optmiize remove functionalitly for* situations in which the original value is not required.** @param oKey key whose mapping is to be removed from the map** @return true iff the Map changed as the result of this operation*/protected boolean removeBlind(Object oKey) { if (containsKey(oKey)) { remove(oKey); return true; } else { return false; } }    In fact, many of those methods are overridden by AbstractKeySetBasedMap, which extends AbstractKeyBasedMap. Implementations extending  AbstractKeySetBasedMap  still have to implement or override  get() ,  put()  and  remove , and may chose to override  clear()  and  removeBlind() , but do  not  have to override  iterateKeys() ,  containsKey() ,  isEmpty()  or  size() . There are two new methods that do need to be implemented or overridden:    /*** Obtain a set of keys that are represented by this Map.* &amp;lt;p/&amp;gt;* The AbstractKeySetBasedMap only utilizes the internal key set as a* read-only resource.** @return an internal Set of keys that are contained by this Map*/protected abstract Set&amp;lt;K&amp;gt; getInternalKeySet(); /*** Determine if this Iterator should remove an iterated item by calling* remove on the internal key Set Iterator, or by calling removeBlind on* the map itself.** @return true to remove using the internal key Set Iterator or false to* use the {@link AbstractKeyBasedMap#removeBlind(Object)} method*/protected boolean isInternalKeySetIteratorMutable() { return false; }    The  isInternalKeySetIteratorMutable()  method allows for an optimization to be made in  instantiateKeyIterator()  with respect to providing an iterator over the keys of the Map:    /*** Factory pattern: Create a mutable Iterator over the keys in the Map** @return a new instance of Iterator that iterates over the keys in the* Map and supports element removal*/protected Iterator instantiateKeyIterator() { Iterator iter = getInternalKeySet().iterator(); if (!isInternalKeySetIteratorMutable()) { iter = new KeyIterator (iter); } return iter; }    Remember, this method was required by the AbstractKeyBasedMap super class; since the AbstractKeySetBasedMap knows all of its keys, it can implement this method by delegating to the &quot;internal&quot; key set.   These two abstract implementations serve as the basis for over 20 Map implementations in Coherence, and when they were introduced, their use (in the place of AbstractMap) resulted in the elimination of thousands of lines of code.    Next up: The purpose of  Binary , and the various &quot;serialization&quot; Maps. <br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Binary, Buffers and Streams, Oh My!
         ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Binary-Buffers-Streams-Oh-My</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Binary-Buffers-Streams-Oh-My</comments>
<pubDate>Sat, 24 Jul 2010 08:00:21 CDT</pubDate>
<dc:creator></dc:creator>
<category>Tangasol / Oracle</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Binary-Buffers-Streams-Oh-My</guid>
<description><![CDATA[ It's worth spending some time explaining the evolution of one of the most central classes in Coherence:  Binary . The Binary class was introduced in early 2002 as the basis for the partitioned cache, which is the technological cornerstone of today's In-Memory Data Grid (IMDG) products. At the time, we needed a class that would encapsulate the binary form of a key, guarantee immutability, provide a predictable (and machine-independent) hash code, implement  equals() , and be readable and writable, for example to and from a message, packet or stream.   When faced with this set of requirements, one had to look no farther than Java's own String class for an example API that would be well-known on the Java platform, and that is exactly what we did. String is immutable, it represented a  char[]  (while we required a  byte[]  for a binary value), it provided a stable and predictable hash code, an  equals()  implementation, and could easily be read from and written to a stream. The early version of Binary provided this rough set of capabilities.   The idea behind the partitioned cache was to take an infinite domain of keys and reduce that infinite domain down to a finite domain of partitions, with the cluster responsible for (1) assigning ownership of those partitions to cluster members, and (2) assigning backup responsibilities to other members. Even before we introduced the partitioned cache, we had to be able to transmit keys over the wire -- for example in a Coherence replicated cache -- and thus we already had support for key serialization. With the introduction of the Binary class, not only was there something to hold the result of that serialization, but there was also a predictable hash code for that result, thus reducing the infinite domain of keys down to a set of 4 billion hash codes, with the understanding that no matter where the key was serialized, it would result in the same hash code. The partition identifier (PID) is calculated from that hash code modulo the maximum (preferably prime) number of partitions.   Given some implementation of serialization, such as Java Serializable/Externalizable, Coherence ExternalizableLite, Google Protocol Buffers, or the Portable Object Format (POF), and given a context (i.e. such necessary things as a ClassLoader), there exists a function  f()  such that  Binary=f(Object) , some inverse function  f -1   such that  Object=f -1 (Binary) , and subject to Java's rules of equality as defined by  equals() , the following must hold true for keys:     For a given Binary key  b ,  b == f(f -1 (b))     For a given Object key  o ,  o == f -1 (f(o))     For two given Object keys  o1  and  o2 ,  o1 == o2  iff  f(o1) == f(o2)      Generally speaking, we refer to that function  f()  as  toBinary() , and that inverse function  f -1   as  fromBinary() , although the actual interface is far less reminiscent of SmallTalk:     /*** The Serializer interface provides the capability of reading and writing a* Java object from and to an in-memory buffer.* &amp;lt;p/&amp;gt;* Serializer implementations should implement the ClassLoaderAware interface* if they need access to a ClassLoader. However, to support hot-deploying* containers, it is important that a Serializer &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; hold any strong* references to that ClassLoader, or to any Class objects obtained from that* ClassLoader.* * @author cp/jh 2007.07.21** @see ReadBuffer* @see WriteBuffer** @since Coherence 3.2*/public interface Serializer { /** * Serialize an object to a WriteBuffer by writing its state using the * specified BufferOutput object. * * @param out the BufferOutput with which to write the object's state * @param o the object to serialize * * @exception IOException if an I/O error occurs */ public void serialize(WriteBuffer.BufferOutput out, Object o) throws IOException; /** * Deserialize an object from a ReadBuffer by reading its state using the * specified BufferInput object. * * @param in the BufferInput with which to read the object's state * * @return the deserialized user type instance * * @exception IOException if an I/O error occurs */ public Object deserialize(ReadBuffer.BufferInput in) throws IOException; }     What has changed significantly since that time is how Binary objects are constructed. Early on, a DataOutputStream around a ByteArrayOutputStream would have been the likeliest route, with the resulting byte[] being passed to the Binary constructor. There are a few problems with this:     Binary is immutable, so just like when passing a char[] to the String constructor, Binary would have to copy the passed byte[], which is inefficient.     Writing via a DataOutputStream tends to be inefficient, including synchronization and many calls to the underlying OutputStream.     ByteArrayOutputStream is heavily synchronized.     ByteArrayOutputStream itself makes a copy of the byte[], which is yet another memory allocation and memory copy!     Streams are handy for dealing with unlimited and/or unknown amounts of data, but keys are small and we're serializing them for the purpose of creating a Binary (i.e. on-heap) object.     The straw that broke the camel's back was the introduction of the NIO APIs, which were buffer-centric, and largely incongruent (and without custom adapters, incompatible) with the original Java IO stream-based APIs. With pressure to utilize NIO in our TCMP clustering protocol, in our client/server TCP*Extend protocol, and for off-heap and memory-mapped storage, and with the added impetus of profiling information showing gains to be had in message- and data-serialization, we redesigned our I/O around a bonded buffer/stream model. The concept was simple: All stream-based I/O had to continue to be supported, and all buffer-based I/O had to continue to be supported, and in both cases, the end result (e.g. a Binary, an NIO buffer, a packet, or a TCP send) would have to be the same, and would have to be efficiently produced. To accomplish this, we defined I/O both for buffer-based reads and writes, but bonded that with stream-based access to the same data. The resulting interfaces are ReadBuffer and WriteBuffer for representing buffer access, and their inner interfaces BufferInput and BufferOutput for representing stream access:     /*** The ReadBuffer interface represents an in-memory block of binary data,* such as that represented by a byte[], a Binary object, or an NIO buffer.** @author cp 2005.01.18*/public interface ReadBuffer extends ByteSequence, Cloneable { /** * Determine the length of the buffer. * * @return the number of bytes of data represented by this ReadBuffer */ public int length(); /** * Returns the byte at the specified offset. An offset ranges * from &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;length() - 1&amp;lt;/code&amp;gt;. The first byte * of the sequence is at offset &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;, the next at offset * &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, and so on, as for array indexing. * * @param of the offset (index) of the byte * * @return the byte at the specified offset in this ReadBuffer * * @exception IndexOutOfBoundsException if the &amp;lt;code&amp;gt;of&amp;lt;/code&amp;gt; * argument is negative or not less than the length of this * ReadBuffer */ public byte byteAt(int of); /** * Copies bytes from this ReadBuffer into the destination byte array. * &amp;lt;p&amp;gt; * The first byte to be copied is at offset &amp;lt;code&amp;gt;ofBegin&amp;lt;/code&amp;gt;; * the last byte to be copied is at offset &amp;lt;code&amp;gt;ofEnd-1&amp;lt;/code&amp;gt; * (thus the total number of bytes to be copied is &amp;lt;code&amp;gt;ofEnd - * ofBegin&amp;lt;/code&amp;gt;). The bytes are copied into the subarray of * &amp;lt;code&amp;gt;abDest&amp;lt;/code&amp;gt; starting at offset &amp;lt;code&amp;gt;ofDest&amp;lt;/code&amp;gt; * and ending at index: * &amp;lt;p&amp;gt;&amp;lt;blockquote&amp;gt;&amp;lt;pre&amp;gt; * ofDest + (ofEnd - ofBegin) - 1 * &amp;lt;/pre&amp;gt;&amp;lt;/blockquote&amp;gt; * &amp;lt;p&amp;gt; * This method is the ReadBuffer equivalent of * {@link String#getChars(int, int, char[], int)}. It allows the caller * to extract a chunk of bytes into the caller's own array. * * @param ofBegin offset of the first byte in the ReadBuffer to copy * @param ofEnd offset after the last byte in the ReadBuffer to copy * @param abDest the destination byte array * @param ofDest the offset in the destination byte array to copy the * first byte to * * @exception IndexOutOfBoundsException Thrown if any of the following * is true: * &amp;lt;ul&amp;gt; * &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ofBegin&amp;lt;/code&amp;gt; is negative; * &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ofBegin&amp;lt;/code&amp;gt; is greater than &amp;lt;code&amp;gt;ofEnd&amp;lt;/code&amp;gt; * &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ofEnd&amp;lt;/code&amp;gt; is greater than the length of this * ReadBuffer; * &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ofDest&amp;lt;/code&amp;gt; is negative * &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;ofDest + (ofEnd - ofBegin)&amp;lt;/code&amp;gt; is larger than * &amp;lt;code&amp;gt;abDest.length&amp;lt;/code&amp;gt; * &amp;lt;/ul&amp;gt; * @exception NullPointerException if &amp;lt;code&amp;gt;abDest&amp;lt;/code&amp;gt; is * &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; */ public void copyBytes(int ofBegin, int ofEnd, byte abDest[], int ofDest); /** * Get a BufferInput object to read data from this buffer. Note that each * call to this method will return a new BufferInput object, with the * possible exception being that a zero-length ReadBuffer could always * return the same instance (since there is nothing to read). * * @return a BufferInput that is reading from this buffer starting at * offset zero */ public BufferInput getBufferInput(); /** * Obtain a ReadBuffer for a portion of this ReadBuffer. * * @param of the beginning index, inclusive * @param cb the number of bytes to include in the resulting ReadBuffer * * @return a ReadBuffer that represents a portion of this ReadBuffer * * @exception IndexOutOfBoundsException if &amp;lt;code&amp;gt;of&amp;lt;/code&amp;gt; or * &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; is negative, or &amp;lt;code&amp;gt;of + cb&amp;lt;/code&amp;gt; is * larger than the length of this &amp;lt;code&amp;gt;ReadBuffer&amp;lt;/code&amp;gt; * object */ public ReadBuffer getReadBuffer(int of, int cb); /** * Get the contents of the ReadBuffer as a byte array. * &amp;lt;p&amp;gt; * This is the equivalent of &amp;lt;code&amp;gt;toByteArray(0, length())&amp;lt;/code&amp;gt;. * * @return a byte[] with the contents of this ReadBuffer object */ public byte[] toByteArray(); /** * Get a portion of the contents of the ReadBuffer as a byte array. * &amp;lt;p&amp;gt; * This is the equivalent of * &amp;lt;code&amp;gt;getReadBuffer(of, cb).toByteArray()&amp;lt;/code&amp;gt;. * * @param of the beginning index, inclusive * @param cb the number of bytes to include in the resulting byte[] * * @return a byte[] containing the specified portion of this ReadBuffer * * @exception IndexOutOfBoundsException if &amp;lt;code&amp;gt;of&amp;lt;/code&amp;gt; or * &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; is negative, or &amp;lt;code&amp;gt;of + cb&amp;lt;/code&amp;gt; is * larger than the length of this &amp;lt;code&amp;gt;ReadBuffer&amp;lt;/code&amp;gt; * object */ public byte[] toByteArray(int of, int cb); /** * Returns a new Binary object that holds the complete contents of this * ReadBuffer. * &amp;lt;p&amp;gt; * This is the equivalent of &amp;lt;code&amp;gt;toBinary(0, length())&amp;lt;/code&amp;gt;. * * @return the contents of this ReadBuffer as a Binary object */ public Binary toBinary(); /** * Returns a Binary object that holds the specified portion of this * ReadBuffer. * &amp;lt;p&amp;gt; * This is the equivalent of * &amp;lt;code&amp;gt;getReadBuffer(of, cb).toBinary()&amp;lt;/code&amp;gt;. * * @param of the beginning index, inclusive * @param cb the number of bytes to include in the Binary object * * @return a Binary object containing the specified portion of this * ReadBuffer * * @exception IndexOutOfBoundsException if &amp;lt;code&amp;gt;of&amp;lt;/code&amp;gt; or * &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; is negative, or &amp;lt;code&amp;gt;of + cb&amp;lt;/code&amp;gt; is * larger than the length of this &amp;lt;code&amp;gt;ReadBuffer&amp;lt;/code&amp;gt; * object */ public Binary toBinary(int of, int cb); /** * {@inheritDoc} * * @since Coherence 3.7 */ public ByteSequence subSequence(int ofStart, int ofEnd); // ----- Object methods ------------------------------------------------- /** * Compare two ReadBuffer objects for equality. * * @param o a ReadBuffer object * * @return true iff the other ReadBuffer is identical to this */ public boolean equals(Object o); /** * Create a clone of this ReadBuffer object. * * @return a ReadBuffer object with the same contents as this * ReadBuffer object */ public Object clone(); // ----- inner interface: BufferInput ----------------------------------- /** * The BufferInput interface represents a DataInputStream on top of a * ReadBuffer. * * @author cp 2005.01.18 */ public interface BufferInput extends InputStreaming, DataInput { // ----- InputStreaming methods --------------------------------- /** * Returns the number of bytes that can be read (or skipped over) from * this input stream without causing a blocking I/O condition to * occur. This method reflects the assumed implementation of various * buffering InputStreams, which can guarantee non-blocking reads up * to the extent of their buffers, but beyond that the read operations * will have to read from some underlying (and potentially blocking) * source. * &amp;lt;p&amp;gt; * BufferInput implementations must implement this method to return * the extent of the buffer that has not yet been read; in other * words, the entire un-read portion of the buffer &amp;lt;b&amp;gt;must&amp;lt;/b&amp;gt; be * available. * * @return the number of bytes that can be read from this InputStream * without blocking * * @exception IOException if an I/O error occurs */ public int available() throws IOException; /** * Close the InputStream and release any system resources associated * with it. * &amp;lt;p&amp;gt; * BufferInput implementations do not pass this call down onto an * underlying stream, if any. * * @exception IOException if an I/O error occurs */ public void close() throws IOException; /** * Marks the current read position in the InputStream in order to * support the stream to be later &quot;rewound&quot; (using the {@link #reset} * method) to the current position. The caller passes in the maximum * number of bytes that it expects to read before calling the * {@link #reset} method, thus indicating the upper bounds of the * responsibility of the stream to be able to buffer what it has read * in order to support this functionality. * &amp;lt;p&amp;gt; * BufferInput implementations ignore the &amp;lt;code&amp;gt;cbReadLimit&amp;lt;/code&amp;gt;; * they must support an unlimited read limit, since they appear to the * user as an input stream on top of a fully realized read buffer. * * @param cbReadLimit the maximum number of bytes that caller expects * the InputStream to be able to read before the * mark position becomes invalid */ public void mark(int cbReadLimit); /** * Determine if this InputStream supports the {@link #mark} and * {@link #reset} methods. * &amp;lt;p&amp;gt; * BufferInput implementations &amp;lt;b&amp;gt;must&amp;lt;/b&amp;gt; support the {@link #mark} * and {@link #reset} methods, so this method always returns * &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. * * @return &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if this InputStream supports the mark * and reset method; &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; otherwise */ public boolean markSupported(); // ----- DataInput methods -------------------------------------- /** * Read &amp;lt;code&amp;gt;ab.length&amp;lt;/code&amp;gt; bytes and store them in * &amp;lt;code&amp;gt;ab&amp;lt;/code&amp;gt;. * &amp;lt;p&amp;gt; * This method blocks until input data is available, the end of the * stream is detected, or an exception is thrown. * * @param ab the array to store the bytes which are read from the * stream * * @exception NullPointerException if the passed array is null * @exception java.io.EOFException if the stream is exhausted before the * number * of bytes indicated by the array length could be read * @exception IOException if an I/O error occurs */ public void readFully(byte ab[]) throws IOException; /** * Read &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; bytes and store them in &amp;lt;code&amp;gt;ab&amp;lt;/code&amp;gt; * starting at offset &amp;lt;code&amp;gt;of&amp;lt;/code&amp;gt;. * &amp;lt;p&amp;gt; * This method blocks until input data is available, the end of the * stream is detected, or an exception is thrown. * * @param ab the array to store the bytes which are read from the * stream * @param of the offset into the array that the read bytes will be * stored * @param cb the maximum number of bytes to read * * @exception NullPointerException if the passed array is null * @exception IndexOutOfBoundsException if &amp;lt;code&amp;gt;of&amp;lt;/code&amp;gt; or * &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; is negative, or &amp;lt;code&amp;gt;of+cb&amp;lt;/code&amp;gt; is * greater than the length of the &amp;lt;code&amp;gt;ab&amp;lt;/code&amp;gt; * @exception java.io.EOFException if the stream is exhausted before the * number of bytes indicated by the array length could be * read * @exception IOException if an I/O error occurs */ public void readFully(byte ab[], int of, int cb) throws IOException; /** * Skips over up to the specified number of bytes of data. The number * of bytes actually skipped over may be fewer than the number * specified to skip, and may even be zero; this can be caused by an * end-of-file condition, but can also occur even when there is data * remaining to be read. As a result, the caller should check the * return value from this method, which indicates the actual number of * bytes skipped. * * @param cb the maximum number of bytes to skip over * * @return the actual number of bytes that were skipped over * * @exception IOException if an I/O error occurs */ public int skipBytes(int cb) throws IOException; /** * Read a boolean value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeBoolean} method. * * @return either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public boolean readBoolean() throws IOException; /** * Read a byte value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeByte} method. * * @return a &amp;lt;code&amp;gt;byte&amp;lt;/code&amp;gt; value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public byte readByte() throws IOException; /** * Read an unsigned byte value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeByte} method when it is used with * unsigned 8-bit values. * * @return an &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; value in the range 0x00 to 0xFF * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public int readUnsignedByte() throws IOException; /** * Read a short value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeShort} method. * * @return a &amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt; value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public short readShort() throws IOException; /** * Read an unsigned short value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeShort} method when it is used with * unsigned 16-bit values. * * @return an &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; value in the range of 0x0000 to 0xFFFF * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public int readUnsignedShort() throws IOException; /** * Read a char value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeChar} method. * * @return a &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public char readChar() throws IOException; /** * Read an int value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeInt} method. * * @return an &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public int readInt() throws IOException; /** * Read a long value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeLong} method. * * @return a &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt; value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public long readLong() throws IOException; /** * Read a float value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeFloat} method. * * @return a &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public float readFloat() throws IOException; /** * Read a double value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeDouble} method. * * @return a &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; value * * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public double readDouble() throws IOException; /** * Reads the next &quot;line&quot; of text. * &amp;lt;p&amp;gt; * This method does not have a counterpart in the * {@link java.io.DataOutput} interface. Furthermore, this method is * defined as operating on bytes and not on characters, and thus it * should be selected for use only after careful consideration, as if * it were deprecated (which it has been in java.io.DataInputStream). * * @return a line of text as a String * @exception IOException if an I/O error occurs. */ public String readLine() throws IOException; /** * Reads a String value. * &amp;lt;p&amp;gt; * This method is the counterpart for the * {@link java.io.DataOutput#writeUTF} method. * * @return a String value * * @exception java.io.UTFDataFormatException if the bytes that were * read were not * a valid UTF-8 encoded string * @exception EOFException if the value could not be read because no * more data remains to be read * @exception IOException if an I/O error occurs */ public String readUTF() throws IOException; // ----- BufferInput methods ------------------------------------ /** * Get the ReadBuffer object that this BufferInput is reading from. * * @return the underlying ReadBuffer object */ public ReadBuffer getBuffer(); /** * Read a variable-length encoded UTF packed String. The major * differences between this implementation and DataInput is that this * supports null String values and is not limited to 64KB UTF-encoded * values. * * @return a String value; may be null * * @exception IOException if an I/O error occurs */ public String readSafeUTF() throws IOException; /** * Read an int value using a variable-length storage format as described * by {@link WriteBuffer.BufferOutput#writePackedInt(int)}. * * @return an int value * * @exception IOException if an I/O error occurs */ public int readPackedInt() throws IOException; /** * Read a long value using a variable-length storage format as described * by {@link WriteBuffer.BufferOutput#writePackedLong(long)}. * * @return a long value * * @exception IOException if an I/O error occurs */ public long readPackedLong() throws IOException; /** * Read &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; bytes and return them as a ReadBuffer object. * * @param cb the number of bytes to read * * @return a ReadBuffer object composed of &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; bytes read * from the BufferInput * * @exception EOFException if the stream is exhausted before * the number of bytes indicated could be read * @exception IOException if an I/O error occurs */ public ReadBuffer readBuffer(int cb) throws IOException; /** * Determine the current offset of this BufferInput within the * underlying ReadBuffer. * * @return the offset of the next byte to read from the ReadBuffer */ public int getOffset(); /** * Specify the offset of the next byte to read from the underlying * ReadBuffer. * * @param of the offset of the next byte to read from the ReadBuffer * * @exception IndexOutOfBoundsException if &amp;lt;code&amp;gt;of &amp;lt; 0&amp;lt;/code&amp;gt; or * &amp;lt;code&amp;gt;of &amp;gt; getBuffer().length()&amp;lt;/code&amp;gt; */ public void setOffset(int of); } } /*** The WriteBuffer interface represents an in-memory block of binary data* that is being accumulated (written to). It is analogous to the byte[]* inside a Java ByteArrayOutputStream.** @author cp 2005.01.18 created* @author cp 2005.03.21 defining*/public interface WriteBuffer { // ----- buffer write operations ---------------------------------------- /** * Store the specified byte at the specified offset within the buffer. * &amp;lt;p&amp;gt; * For purposes of side-effects and potential exceptions, this method is * functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * byte[] abSrc = new byte[1]; * abSrc[0] = b; * write(ofDest, abSrc, 0, abSrc.length); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param ofDest the offset within this buffer to store the passed data * @param b the byte to store in this buffer */ public void write(int ofDest, byte b); /** * Store the specified bytes at the specified offset within the buffer. * &amp;lt;p&amp;gt; * For purposes of side-effects and potential exceptions, this method is * functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * write(ofDest, abSrc, 0, abSrc.length); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param ofDest the offset within this buffer to store the passed data * @param abSrc the array of bytes to store in this buffer * * @exception NullPointerException if &amp;lt;code&amp;gt;abSrc&amp;lt;/code&amp;gt; is * &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;ofDest&amp;lt;/tt&amp;gt; is negative, * or if &amp;lt;tt&amp;gt;ofDest + abSrc.length&amp;lt;/tt&amp;gt; is * greater than &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()}&amp;lt;/tt&amp;gt; */ public void write(int ofDest, byte[] abSrc); /** * Store the specified number of bytes from the specified location within * the passed byte array at the specified offset within this buffer. * &amp;lt;p&amp;gt; * As a result of this method, the buffer length as reported by the * &amp;lt;tt&amp;gt;{@link #length()}&amp;lt;/tt&amp;gt; method will become * &amp;lt;tt&amp;gt;Math.max({@link #length()}, ofDest + cbSrc)&amp;lt;/tt&amp;gt;. * &amp;lt;p&amp;gt; * As a result of this method, the buffer capacity as reported by the * &amp;lt;tt&amp;gt;{@link #getCapacity()}&amp;lt;/tt&amp;gt; method will not change if the new value * returned by &amp;lt;tt&amp;gt;{@link #length()}&amp;lt;/tt&amp;gt; would not exceed the old value * returned by &amp;lt;tt&amp;gt;{@link #getCapacity()}&amp;lt;/tt&amp;gt;; otherwise, the capacity * will be increased such that * &amp;lt;tt&amp;gt;{@link #getCapacity()} &amp;gt;= {@link #length()}&amp;lt;/tt&amp;gt;. Regardless, it is * always true that &amp;lt;tt&amp;gt;{@link #getCapacity()} &amp;gt;= {@link #length()}&amp;lt;/tt&amp;gt; * and &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()} &amp;gt;= {@link #getCapacity()}&amp;lt;/tt&amp;gt;. * If the buffer capacity cannot be increased due to resource constraints, * an undesignated Error or RuntimeException will be thrown, such as * OutOfMemoryError. * * @param ofDest the offset within this buffer to store the passed data * @param abSrc the array containing the bytes to store in this buffer * @param ofSrc the offset within the passed byte array to copy from * @param cbSrc the number of bytes to copy from the passed byte array * * @exception NullPointerException if &amp;lt;code&amp;gt;abSrc&amp;lt;/code&amp;gt; is * &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;ofDest&amp;lt;/tt&amp;gt;, * &amp;lt;tt&amp;gt;ofSrc&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;cbSrc&amp;lt;/tt&amp;gt; is negative, if * &amp;lt;tt&amp;gt;ofSrc + cbSrc&amp;lt;/tt&amp;gt; is greater than * &amp;lt;tt&amp;gt;abSrc.length&amp;lt;/tt&amp;gt;, or if &amp;lt;tt&amp;gt;ofDest + cbSrc&amp;lt;/tt&amp;gt; is * greater than &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()}&amp;lt;/tt&amp;gt; */ public void write(int ofDest, byte[] abSrc, int ofSrc, int cbSrc); /** * Store the contents of the specified ReadBuffer at the specified offset * within this buffer. * &amp;lt;p&amp;gt; * For purposes of side-effects and potential exceptions, this method is * functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * byte[] abSrc = bufSrc.toByteArray(); * write(ofDest, abSrc, 0, abSrc.length); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param ofDest the offset within this buffer to store the passed data * @param bufSrc the array of bytes to store in this buffer * * @exception NullPointerException if &amp;lt;code&amp;gt;bufSrc&amp;lt;/code&amp;gt; is * &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;ofDest&amp;lt;/tt&amp;gt; is negative, * or if &amp;lt;tt&amp;gt;ofDest + bufSrc.length()&amp;lt;/tt&amp;gt; is * greater than &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()}&amp;lt;/tt&amp;gt; */ public void write(int ofDest, ReadBuffer bufSrc); /** * Store the specified portion of the contents of the specified ReadBuffer * at the specified offset within this buffer. * &amp;lt;p&amp;gt; * For purposes of side-effects and potential exceptions, this method is * functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * byte[] abSrc = bufSrc.toByteArray(ofSrc, cbSrc); * write(ofDest, abSrc, 0, abSrc.length); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param ofDest the offset within this buffer to store the passed data * @param bufSrc the array of bytes to store in this buffer * @param ofSrc the offset within the passed ReadBuffer to copy from * @param cbSrc the number of bytes to copy from the passed ReadBuffer * * @exception NullPointerException if &amp;lt;code&amp;gt;bufSrc&amp;lt;/code&amp;gt; is * &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;ofDest&amp;lt;/tt&amp;gt;, * &amp;lt;tt&amp;gt;ofSrc&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;cbSrc&amp;lt;/tt&amp;gt; is negative, if * &amp;lt;tt&amp;gt;ofSrc + cbSrc&amp;lt;/tt&amp;gt; is greater than * &amp;lt;tt&amp;gt;bufSrc.length()&amp;lt;/tt&amp;gt;, or if &amp;lt;tt&amp;gt;ofDest + cbSrc&amp;lt;/tt&amp;gt; is * greater than &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()}&amp;lt;/tt&amp;gt; */ public void write(int ofDest, ReadBuffer bufSrc, int ofSrc, int cbSrc); /** * Store the remaining contents of the specified InputStreaming object at * the specified offset within this buffer. * &amp;lt;p&amp;gt; * For purposes of side-effects and potential exceptions, this method is * functionally &amp;lt;i&amp;gt;similar&amp;lt;/i&amp;gt; to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * ByteArrayOutputStream streamOut = new ByteArrayOutputStream(); * int b; * while ((b = stream.read()) &amp;gt;= 0) * { * streamOut.write(b); * } * byte[] abSrc = streamOut.toByteArray(); * write(ofDest, abSrc, 0, abSrc.length); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param ofDest the offset within this buffer to store the passed data * @param stream the stream of bytes to read and store in this buffer * * @exception IOException if an IOException occurs reading from the * passed stream */ public void write(int ofDest, InputStreaming stream) throws IOException; /** * Store the specified number of bytes from the specified InputStreaming * object at the specified offset within this buffer. * &amp;lt;p&amp;gt; * For purposes of side-effects and potential exceptions, this method is * functionally &amp;lt;i&amp;gt;similar&amp;lt;/i&amp;gt; to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * DataInputStream streamData = new DataInputStream( * new WrapperInputStream(stream)); * byte[] abSrc = new byte[cbSrc]; * streamData.readFully(abSrc); * write(ofDest, abSrc, 0, abSrc.length); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param ofDest the offset within this buffer to store the passed data * @param stream the stream of bytes to read and store in this buffer * @param cbSrc the exact number of bytes to read from the stream and * put in this buffer * * @exception IOException if an IOException occurs reading from the * passed stream */ public void write(int ofDest, InputStreaming stream, int cbSrc) throws IOException; // ----- buffer maintenance ---------------------------------------------- /** * Determine the length of the data that is in the buffer. This is the * actual number of bytes of data that have been written to the buffer, * not the capacity of the buffer. * * @return the number of bytes of data represented by this WriteBuffer */ public int length(); /** * Starting with the byte at offset &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt;, retain the remainder * of this WriteBuffer, such that the byte at offset &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; is * shifted to offset 0, the byte at offset &amp;lt;tt&amp;gt;of + 1&amp;lt;/tt&amp;gt; is shifted to * offset 1, and so on up to the byte at offset * &amp;lt;tt&amp;gt;{@link #length()} - 1&amp;lt;/tt&amp;gt;, which is shifted to offset * &amp;lt;tt&amp;gt;{@link #length()} - of - 1&amp;lt;/tt&amp;gt;. After this method, the length of * of the buffer as indicated by the {@link #length()} method will be * equal to &amp;lt;tt&amp;gt;{@link #length()} - of&amp;lt;/tt&amp;gt;. * &amp;lt;p&amp;gt; * This method is functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * retain(of, length() - of); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param of the offset of the first byte within the WriteBuffer that * will be retained * * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; is negative or if * &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; is greater than &amp;lt;tt&amp;gt;{@link #length()}&amp;lt;/tt&amp;gt; */ public void retain(int of); /** * Starting with the byte at offset &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt;, retain &amp;lt;tt&amp;gt;cb&amp;lt;/tt&amp;gt; bytes * in this WriteBuffer, such that the byte at offset &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; is * shifted to offset 0, the byte at offset &amp;lt;tt&amp;gt;of + 1&amp;lt;/tt&amp;gt; is shifted to * offset 1, and so on up to the byte at offset &amp;lt;tt&amp;gt;of + cb - 1&amp;lt;/tt&amp;gt;, * which is shifted to offset &amp;lt;tt&amp;gt;cb - 1&amp;lt;/tt&amp;gt;. After this method, the * length of the buffer as indicated by the {@link #length()} method will * be equal to &amp;lt;tt&amp;gt;cb&amp;lt;/tt&amp;gt;. * &amp;lt;p&amp;gt; * Legal values for the offset of the first byte to retain &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; are * &amp;lt;tt&amp;gt;(of &amp;gt;= 0 &amp;amp;&amp;amp; of &amp;lt;= {@link #length()})&amp;lt;/tt&amp;gt;. Legal values for the * number of bytes to retain &amp;lt;tt&amp;gt;cb&amp;lt;/tt&amp;gt; are * &amp;lt;tt&amp;gt;(cb &amp;gt;= 0 &amp;amp;&amp;amp; cb &amp;lt;= {@link #length()})&amp;lt;/tt&amp;gt;, such that * &amp;lt;tt&amp;gt;(of + cb &amp;lt;= {@link #length()})&amp;lt;/tt&amp;gt;. * &amp;lt;p&amp;gt; * If &amp;lt;tt&amp;gt;cb&amp;lt;/tt&amp;gt; is zero, then this method will have the same effect as * clear. If &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; is zero, then this method will have the effect * of truncating the data in the buffer, but no bytes will be shifted * within the buffer. * &amp;lt;p&amp;gt; * The effect on the capacity of the buffer is implementation-specific; * some implementations are expected to retain the same capacity while * others are expected to shrink accordingly. * * @param of the offset of the first byte within the WriteBuffer that * will be retained * @param cb the number of bytes to retain * * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;cb&amp;lt;/tt&amp;gt; is * negative of if &amp;lt;tt&amp;gt;of + cb&amp;lt;/tt&amp;gt; is greater than * &amp;lt;tt&amp;gt;{@link #length()}&amp;lt;/tt&amp;gt; */ public void retain(int of, int cb); /** * Set the length of the buffer as indicated by the {@link #length()} * method to zero. * &amp;lt;p&amp;gt; * The effect on the capacity of the buffer is implementation-specific; * some implementations are expected to retain the same capacity while * others are expected to shrink accordingly. */ public void clear(); /** * Determine the number of bytes that the buffer can hold without resizing * itself. In other words, a WriteBuffer has &amp;lt;tt&amp;gt;getCapacity() - * {@link #length()}&amp;lt;/tt&amp;gt; bytes that can be written to it without * overflowing the current underlying buffer allocation. Since the buffer * is an abstract concept, the actual mechanism for the underlying buffer * is not known, but it could be a Java NIO buffer, or a byte array, etc. * &amp;lt;p&amp;gt; * Note that if the maximum size returned by {@link #getMaximumCapacity()} * is greater than the current size returned by this method, then the * WriteBuffer will automatically resize itself to allocate more space * when the amount of data written to it passes the current size. * * @return the number of bytes of data that this WriteBuffer can hold * without resizing its underlying buffer */ public int getCapacity(); /** * Determine the maximum number of bytes that the buffer can hold. If the * maximum size is greater than the current size, then the buffer is * expected to resize itself as necessary up to the maximum size in order * to contain the data given to it. * * @return the maximum number of bytes of data that the WriteBuffer can * hold */ public int getMaximumCapacity(); // ----- obtaining different &quot;write views&quot; to the buffer ---------------- /** * Obtain a WriteBuffer starting at a particular offset within this * WriteBuffer. * &amp;lt;p&amp;gt; * This is functionally equivalent to: * &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt; * return getWriteBuffer(of, getMaximumCapacity() - of); * &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; * * @param of the beginning index, inclusive * * @return a WriteBuffer that represents a portion of this WriteBuffer * * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; is * negative, or &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; is larger than the * &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()}&amp;lt;/tt&amp;gt; of this * &amp;lt;tt&amp;gt;WriteBuffer&amp;lt;/tt&amp;gt; object */ public WriteBuffer getWriteBuffer(int of); /** * Obtain a WriteBuffer for a portion of this WriteBuffer. * &amp;lt;p&amp;gt; * Use of the resulting buffer will correspond to using this buffer * directly but with the offset being passed to the buffer methods * automatically having &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; added. As a result, the length of this * buffer can be modified by writing to the new buffer; however, changes * made directly to this buffer will not affect the length of the new * buffer. * &amp;lt;p&amp;gt; * Note that the resulting WriteBuffer is limited in the number of bytes * that can be written to it; in other words, its * &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()}&amp;lt;/tt&amp;gt; must return the same value as * was passed in &amp;lt;tt&amp;gt;cb&amp;lt;/tt&amp;gt;. * * @param of the offset of the first byte within this WriteBuffer * to map to offset 0 of the new WriteBuffer * @param cb the number of bytes to cover in the resulting WriteBuffer * * @return a WriteBuffer that represents a portion of this WriteBuffer * * @exception IndexOutOfBoundsException if &amp;lt;tt&amp;gt;of&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;cb&amp;lt;/tt&amp;gt; * is negative, or &amp;lt;tt&amp;gt;of + cb&amp;lt;/tt&amp;gt; is larger than * the &amp;lt;tt&amp;gt;{@link #getMaximumCapacity()}&amp;lt;/tt&amp;gt; of this * &amp;lt;tt&amp;gt;WriteBuffer&amp;lt;/tt&amp;gt; object */ public WriteBuffer getWriteBuffer(int of, int cb); /** * Get a BufferOutput object to write data to this buffer, starting at * the beginning of the WriteBuffer. * &amp;lt;p&amp;gt; * This is functionally equivalent to: * &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt; * return getBufferOutput(0); * &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; * * @return a BufferOutput that is writing to this buffer starting at * offset zero */ public BufferOutput getBufferOutput(); /** * Get a BufferOutput object to write data to this buffer starting at a * particular offset. * &amp;lt;p&amp;gt; * Note that each call to this method will return a new BufferOutput * object, with the possible exception being that a zero-length * non-resizing WriteBuffer could always return the same instance (since * it is not writable). * &amp;lt;p&amp;gt; * This is functionally equivalent to: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * BufferOutput bufout = getBufferOutput(); * bufout.setOffset(of); * return bufout; * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @param of the offset of the first byte of this buffer that the * BufferOutput will write to * * @return a BufferOutput that will write to this buffer */ public BufferOutput getBufferOutput(int of); /** * Get a BufferOutput object to write data to this buffer. The * BufferOutput object returned by this method is set to append to the * WriteBuffer, meaning that its offset is pre-set to the * {@link #length()} of this buffer. * &amp;lt;p&amp;gt; * This is functionally equivalent to: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * return getBufferOutput(length()); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @return a BufferOutput configured to append to this buffer */ public BufferOutput getAppendingBufferOutput(); // ----- accessing the buffered data ------------------------------------ /** * Get a ReadBuffer object that is a snapshot of this WriteBuffer's data. * &amp;lt;p&amp;gt; * This method is functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * ReadBuffer buf = getUnsafeReadBuffer(); * byte[] ab = buf.toByteArray(); * return new ByteArrayReadBuffer(ab); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @return a ReadBuffer that reflects the point-in-time contents of this * WriteBuffer */ public ReadBuffer getReadBuffer(); /** * Get a ReadBuffer object to read data from this buffer. This method is * not guaranteed to return a snapshot of this buffer's data, nor is it * guaranteed to return a live view of this buffer, which means that * subsequent changes to this WriteBuffer may or may not affect the * contents and / or the length of the returned ReadBuffer. * &amp;lt;p&amp;gt; * To get a snapshot, use the {@link #getReadBuffer()} method. * * @return a ReadBuffer that reflects the contents of this WriteBuffer * but whose behavior is undefined if the WriteBuffer is modified */ public ReadBuffer getUnsafeReadBuffer(); /** * Returns a new byte array that holds the complete contents of this * WriteBuffer. * &amp;lt;p&amp;gt; * This method is functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * return getUnsafeReadBuffer().toByteArray(); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @return the contents of this WriteBuffer as a byte[] */ public byte[] toByteArray(); /** * Returns a new Binary object that holds the complete contents of this * WriteBuffer. * &amp;lt;p&amp;gt; * This method is functionally equivalent to the following code: * &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; * return getUnsafeReadBuffer().toBinary(); * &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; * * @return the contents of this WriteBuffer as a Binary object */ public Binary toBinary(); // ----- Object methods ------------------------------------------------- /** * Create a clone of this WriteBuffer object. Changes to the clone will * not affect the original, and vice-versa. * * @return a WriteBuffer object with the same contents as this * WriteBuffer object */ public Object clone(); // ----- inner interface: BufferOutput ---------------------------------- /** * The BufferOutput interface represents a DataOutputStream on top of a * WriteBuffer. * * @author cp 2005.01.18 */ public interface BufferOutput extends OutputStreaming, DataOutput { // ----- OutputStreaming methods -------------------------------- /** * Close the OutputStream and release any system resources associated * with it. * &amp;lt;p&amp;gt; * BufferOutput implementations do not pass this call down onto an * underlying stream, if any. * * @exception IOException if an I/O error occurs */ public void close() throws IOException; // ----- DataOutput methods ------------------------------------- /** * Writes the boolean value &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt;. * * @param f the boolean to be written * * @exception IOException if an I/O error occurs */ public void writeBoolean(boolean f) throws IOException; /** * Writes the eight low-order bits of the argument &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;. The 24 * high-order bits of &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; are ignored. * * @param b the byte to write (passed as an integer) * * @exception IOException if an I/O error occurs */ public void writeByte(int b) throws IOException; /** * Writes a short value, comprised of the 16 low-order bits of the * argument &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;; the 16 high-order bits of &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; are * ignored. * * @param n the short to write (passed as an integer) * * @exception IOException if an I/O error occurs */ public void writeShort(int n) throws IOException; /** * Writes a char value, comprised of the 16 low-order bits of the * argument &amp;lt;tt&amp;gt;ch&amp;lt;/tt&amp;gt;; the 16 high-order bits of &amp;lt;tt&amp;gt;ch&amp;lt;/tt&amp;gt; are * ignored. * * @param ch the char to write (passed as an integer) * * @exception IOException if an I/O error occurs */ public void writeChar(int ch) throws IOException; /** * Writes an int value. * * @param n the int to write * * @exception IOException if an I/O error occurs */ public void writeInt(int n) throws IOException; /** * Writes a long value. * * @param l the long to write * * @exception IOException if an I/O error occurs */ public void writeLong(long l) throws IOException; /** * Writes a float value. * * @param fl the float to write * * @exception IOException if an I/O error occurs */ public void writeFloat(float fl) throws IOException; /** * Writes a double value. * * @param dfl the double to write * * @exception IOException if an I/O error occurs */ public void writeDouble(double dfl) throws IOException; /** * Writes the String &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt;, but only the low-order byte from each * character of the String is written. * * @param s the String to write * * @exception IOException if an I/O error occurs * @exception NullPointerException if &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; */ public void writeBytes(String s) throws IOException; /** * Writes the String &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; as a sequence of characters. * * @param s the String to write * * @exception IOException if an I/O error occurs * @exception NullPointerException if &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; */ public void writeChars(String s) throws IOException; /** * Writes the String &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; as a sequence of characters, but using * UTF-8 encoding for the characters, and including the String length * data so that the corresponding {@link java.io.DataInput#readUTF} * method can reconstitute a String from the written data. * * @param s the String to write * * @exception IOException if an I/O error occurs * @exception NullPointerException if &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;null&amp;lt;/tt&amp;gt; */ public void writeUTF(String s) throws IOException; // ----- BufferOutput methods ----------------------------------- /** * Get the WriteBuffer object that this BufferOutput is writing to. * * @return the underlying WriteBuffer object */ public WriteBuffer getBuffer(); /** * Write a variable-length encoded UTF packed String. The major * differences between this implementation and DataOutput is that this * implementation supports null values and is not limited to 64KB * UTF-encoded values. * &amp;lt;p&amp;gt; * The binary format for a Safe UTF value is a &quot;packed int&quot; for the * binary length followed by the UTF-encoded byte stream. The length * is either -1 (indicating a null String) or in the range * &amp;lt;tt&amp;gt;0 .. Integer.MAX_VALUE&amp;lt;/tt&amp;gt; (inclusive). The UTF-encoded * portion uses a format identical to DataOutput. * * @param s a String value to write; may be null * * @exception IOException if an I/O error occurs */ public void writeSafeUTF(String s) throws IOException; /** * Write an int value using a variable-length storage-format. * &amp;lt;p&amp;gt; * The format differs from DataOutput in that DataOutput always uses * a fixed-length 4-byte Big Endian binary format for int values. * The &quot;packed&quot; format includes a sign bit (0x40) and a continuation * bit (0x80) in the first byte, followed by the least 6 significant * bits of the int value. Subsequent bytes (each appearing only if * the previous byte had its continuation bit set) include a * continuation bit (0x80) and the next least 7 significant bits of * the int value. In this way, a 32-bit value is encoded into 1-5 * bytes, depending on the magnitude of the int value being encoded. * * @param n an int value to write * * @exception IOException if an I/O error occurs */ public void writePackedInt(int n) throws IOException; /** * Write a long value using a variable-length storage-format. * &amp;lt;p&amp;gt; * The format differs from DataOutput in that DataOutput always uses * a fixed-length 8-byte Big Endian binary format for long values. * The &quot;packed&quot; format includes a sign bit (0x40) and a continuation * bit (0x80) in the first byte, followed by the least 6 significant * bits of the long value. Subsequent bytes (each appearing only if * the previous byte had its continuation bit set) include a * continuation bit (0x80) and the next least 7 significant bits of * the long value. In this way, a 64-bit value is encoded into 1-10 * bytes, depending on the magnitude of the long value being encoded. * * @param l a long value to write * * @exception IOException if an I/O error occurs */ public void writePackedLong(long l) throws IOException; /** * Write all the bytes from the passed ReadBuffer object. * &amp;lt;p&amp;gt; * This is functionally equivalent to the following code: * &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt; * getBuffer().write(getOffset(), buf); * &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; * * @param buf a ReadBuffer object * * @exception IOException if an I/O error occurs */ public void writeBuffer(ReadBuffer buf) throws IOException; /** * Write &amp;lt;code&amp;gt;cb&amp;lt;/code&amp;gt; bytes from the passed ReadBuffer object * starting at offset &amp;lt;code&amp;gt;of&amp;lt;/code&amp;gt; within the passed ReadBuffer. * &amp;lt;p&amp;gt; * This is functionally equivalent to the following code: * &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt; * getBuffer().write(getOffset(), buf, of, cb); * &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; * * @param buf a ReadBuffer object * @param of the offset within the ReadBuffer of the first byte to * write to this BufferOutput * @param cb the number of bytes to write * * @exception IOException if an I/O error occurs */ public void writeBuffer(ReadBuffer buf, int of, int cb) throws IOException; /** * Write the remaining contents of the specified InputStreaming * object. * &amp;lt;p&amp;gt; * This is functionally equivalent to the following code: * &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt; * getBuffer().write(getOffset(), stream); * &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; * * @param stream the stream of bytes to write to this BufferOutput * * @exception IOException if an I/O error occurs, specifically if an * IOException occurs reading from the passed stream */ public void writeStream(InputStreaming stream) throws IOException; /** * Write the specified number of bytes of the specified InputStreaming * object. * &amp;lt;p&amp;gt; * This is functionally equivalent to the following code: * &amp;lt;code&amp;gt;&amp;lt;pre&amp;gt; * getBuffer().write(getOffset(), stream, cb); * &amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt; * * @param stream the stream of bytes to write to this BufferOutput * @param cb the exact number of bytes to read from the stream * and write to this BufferOutput * * @exception EOFException if the stream is exhausted before * the number of bytes indicated could be read * @exception IOException if an I/O error occurs, specifically if an * IOException occurs reading from the passed stream */ public void writeStream(InputStreaming stream, int cb) throws IOException; /** * Determine the current offset of this BufferOutput within the * underlying WriteBuffer. * * @return the offset of the next byte to write to the WriteBuffer */ public int getOffset(); /** * Specify the offset of the next byte to write to the underlying * WriteBuffer. * * @param of the offset of the next byte to write to the * WriteBuffer * * @exception IndexOutOfBoundsException if &amp;lt;code&amp;gt;of &amp;lt; 0&amp;lt;/code&amp;gt; or * &amp;lt;code&amp;gt;of &amp;gt; getBuffer().getMaximumCapacity()&amp;lt;/code&amp;gt; */ public void setOffset(int of); // ----- constants ------------------------------------------------------ /** * Maximum encoding length for a packed int value. */ public static final int MAX_PACKED_INT_SIZE = 5; /** * Maximum encoding length for a packed long value. */ public static final int MAX_PACKED_LONG_SIZE = 10; } }     Suddenly there was no either/or trade-off. Data could be efficiently written either as if to an underlying buffer or as if to a stream i.e. a BufferOutput (or to both in tandem!) with the same result. A write of an integer (or a long, or a String, etc.) wouldn't require a series of delegations from one stream to another, and could be optimized based on the type of buffer actually in use. Here is the hierarchy of the WriteBuffer implementations:    AbstractWriteBuffer - implements most of the API, but not optimized for a specific underlying buffer implementation  ByteArrayWriteBuffer - optimized for the underlying buffer being a byte[]  BinaryWriteBuffer - optimized for creating Binary objects when the writing is done    ByteBufferWriteBuffer - optimized for the underlying buffer being an NIO buffer  DelegatingWriteBuffer - eases the implementation of WriteBuffer.getWriteBuffer()  MultiBufferWriteBuffer - allows buffers to be strung together to create large virtual buffers      Likewise, for the ReadBuffer implementations:    AbstractReadBuffer - implements most of the API, but not optimized for a specific underlying buffer implementation  AbstractByteArrayReadBuffer - optimized for the underlying buffer being a byte[]  ByteArrayReadBuffer - for use when the byte[] doesn't have an immutability guarantee  Binary - you've probably seen this class name before!    ByteBufferReadBuffer - optimized for the underlying buffer being an NIO buffer  MultiBufferReadBuffer - allows buffers to be strung together to create large virtual buffers      As you can see, the best part of this architecture is that Binary itself became a ReadBuffer. Now, reading information out of a Binary is as simple as:     BufferInput in = bin.getBufferInput();String s = in.readSafeUTF();int n = in.readInt();Binary bin2 = in.readBuffer(n).toBinary(); // no byte[] alloc or copy!     This buffer design ended up being a crucial element to the success of a number of Coherence features, including the TCP/IP-based Extend protocol, the Portable Object Format (POF), and the 75% reduction in memory allocations (as reported by jRockit profiling tools) that we were able to achieve in our recent Coherence 3.6 release. Furthermore, it serves as the basis for a number of projects that are currently in our R&amp;D pipeline, such as super-efficient on-heap and off-heap storage for even larger data sets, better support for Infiniband and 10G networks, and much more.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Serialization Maps
         ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Serialization-Maps</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Serialization-Maps</comments>
<pubDate>Sat, 24 Jul 2010 08:00:15 CDT</pubDate>
<dc:creator></dc:creator>
<category>Tangasol / Oracle</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Serialization-Maps</guid>
<description><![CDATA[ What do you get when you combine  Binary serialization  with an  AbstractKeyBasedMap or AbstractKeySetBasedMap ? Let's take a look. Let's start with the BinaryStore interface, which represents the ability to store raw (i.e. opaque) Binary data, for example in a file:     public interface BinaryStore { /** * Return the value associated with the specified key, or null if the * key does not have an associated value in the underlying store. * * @param binKey key whose associated value is to be returned * * @return the value associated with the specified key, or *  null  if no value is available for that key */ public Binary load(Binary binKey); /** * Store the specified value under the specific key in the underlying * store. This method is intended to support both key/value creation * and value update for a specific key. * * @param binKey key to store the value under * @param binValue value to be stored * * @throws UnsupportedOperationException if this implementation or the * underlying store is read-only */ public void store(Binary binKey, Binary binValue); /** * Remove the specified key from the underlying store if present. * * @param binKey key whose mapping is to be removed from the map * * @throws UnsupportedOperationException if this implementation or the * underlying store is read-only */ public void erase(Binary binKey); /** * Remove all data from the underlying store. * * @throws UnsupportedOperationException if this implementation or the * underlying store is read-only */ public void eraseAll(); /** * Iterate all keys in the underlying store. * * @return a read-only iterator of the keys in the underlying store * * @throws UnsupportedOperationException if the underlying store is not * iterable */ public Iterator keys(); /** * If a BinaryStore is aware of the number of keys that it stores, then it * should implement this optional interface in order to allow that * information to be efficiently communicated to an intelligent consumer of * the BinaryStore interface. * * @since Coherence 3.7 */ public interface SizeAware extends BinaryStore { /** * Determine the number of keys in the BinaryStore. * * @return the number of keys in the BinaryStore * * @since Coherence 3.7 */ public int size(); } }     The BinaryStore interface is implemented by a number of storage facilities, such as for Oracle Berkeley DB, allowing Coherence to store data off the Java heap, and even on disk. The consumer of the BinaryStore interface that we're looking at today is the serialization map, i.e. a Map implementation that appears to contain object keys and object values, but actually manages a mapping from Binary keys to Binary values by delegating to an underlying BinaryStore. There are a number of serialization map implementations, arranged here by their inheritance relationships:     AbstractKeyBasedMap   SimpleSerializationMap - a basic serialization map that avoids keeping keys in memory     AbstractKeySetBasedMap   SerializationMap - a basic serialization map that relies on the entire key set being in memory  AbstractSerializationCache - an abstract serialization map that adds support for the ObservableMap API  SerializationCache - a serialization map that supports size-limited eviction and time-based expiry via the CacheMap and ConfigurableCacheMap API  SerializationPagedCache - a significantly more complicated expiry-based cache that expires an entire BinaryStore's worth of data at a time          The general implementations of each of these (except for the SerializationPagedCache) are relatively straight-forward. For example, the  get()  implementation on the SimpleSerializationMap:    /*** {@inheritDoc}*/public Object get(Object oKey) { Object oValue = null; long ldtStart = getSafeTimeMillis(); Binary binValue = getBinaryStore().load(toBinary(oKey)); if (binValue == null) { m_stats.registerMiss(ldtStart); } else { oValue = fromBinary(binValue); m_stats.registerHit(ldtStart); } return oValue; }     Note that when a serialization map is used as a backing map, all of its data (both keys and values) are already serialized in a Binary form. As a result, it can pass through those Binary values without any additional serialization/deserialization.   The primary difference between the SimpleSerializationMap and the SerializationMap (and its sub-classes) is that the SimpleSerializationMap doesn't maintain a data structure for the set of keys that it manages, allowing a much larger set of data (e.g. hundreds of millions of objects) to be managed without additional memory pressure.    Trivia:  The &quot;async&quot; configuration option for the serialization maps simply wraps the configured BinaryStore implementation with an instance of AsyncBinaryStore, which is described in its JavaDoc as:     An AsyncBinaryStore is a BinaryStore wrapper that performs the &quot;O&quot; (output) portion of its I/O asynchronously on a daemon thread. The output portion consists of store and erase processing.    Since the &quot;O&quot; portion is passed along to the wrapped BinaryStore on a separate thread, only read operations are blocking, thus the BinaryStore operations on a whole appear much faster. As such, it is somewhat analogous to a write-behind cache.    If an operation fails on the daemon thread, all further operations will occur synchronously, so that exceptions will propagate successfully up. It is assumed that once one exception occurs, the underlying BinaryStore is in a state that will cause more exceptions to occur. Even when an exception occurs on the daemon thread, that write-behind data will not be &quot;lost&quot; because it will still be available in the internal data structures that keeps track of pending writes.  <br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Nvidia: Intel Has No Particular Advantages in Heterogeneous Multi-Core Technologies
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Nvidia-Intel-Has-No-Particular-Advantages-in-Heterogeneous-MultiCore-Technologies</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Nvidia-Intel-Has-No-Particular-Advantages-in-Heterogeneous-MultiCore-Technologies</comments>
<pubDate>Sat, 24 Jul 2010 08:00:07 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Nvidia-Intel-Has-No-Particular-Advantages-in-Heterogeneous-MultiCore-Technologies</guid>
<description><![CDATA[Nvidia Fellow David Kirk takes a swipe at Intel's heterogeneous computing plans.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Predicting Success with Niwa Supercomputer
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Predicting-Success-with-Niwa-Supercomputer</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Predicting-Success-with-Niwa-Supercomputer</comments>
<pubDate>Fri, 23 Jul 2010 08:00:05 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Predicting-Success-with-Niwa-Supercomputer</guid>
<description><![CDATA[New Zealand super will be devoted to weather forecasting and bioscience.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[The Trouble With Multicore
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Trouble-With-Multicore</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Trouble-With-Multicore</comments>
<pubDate>Fri, 23 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Trouble-With-Multicore</guid>
<description><![CDATA[Multicore processors are racing forward, but software is lagging -- and may never catch up.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Reports of Grid's Death Are Greatly Exaggerated
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Reports-Grids-Death-Are-Greatly-Exaggerated</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Reports-Grids-Death-Are-Greatly-Exaggerated</comments>
<pubDate>Thu, 22 Jul 2010 08:00:05 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Reports-Grids-Death-Are-Greatly-Exaggerated</guid>
<description><![CDATA[OGF President Craig Lee offers his take on the grid versus cloud controversy.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Advanced Vector Extensions Will Debut at IDF
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Advanced-Vector-Extensions-Will-Debut-at-IDF</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Advanced-Vector-Extensions-Will-Debut-at-IDF</comments>
<pubDate>Wed, 21 Jul 2010 08:00:05 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Advanced-Vector-Extensions-Will-Debut-at-IDF</guid>
<description><![CDATA[Sandy Bridge architecture will usher in AVX instructions.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Delivering HPC to the New Main Street
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Delivering-HPC-to-New-Main-Street</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Delivering-HPC-to-New-Main-Street</comments>
<pubDate>Wed, 21 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Delivering-HPC-to-New-Main-Street</guid>
<description><![CDATA[Rocky Mountain Supercomputing Center aims to democratize HPC via computing on-demand model.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Cray's Supercomputers Help Put Wisconsin Technology on the World Map
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Crays-Supercomputers-Help-Put-Wisconsin-Technology-on-World-Map</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Crays-Supercomputers-Help-Put-Wisconsin-Technology-on-World-Map</comments>
<pubDate>Tue, 20 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Crays-Supercomputers-Help-Put-Wisconsin-Technology-on-World-Map</guid>
<description><![CDATA[Supercomputer maker became high-tech catalyst for Chippewa Valley.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Computing Expansion
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Computing-Expansion</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Computing-Expansion</comments>
<pubDate>Tue, 20 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Computing-Expansion</guid>
<description><![CDATA[University at Buffalo supercomputer slated for major upgrade.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Cloudy Costs for Amazon’s New HPC Offering
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Cloudy-Costs-Amazons-New-HPC-Offering</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Cloudy-Costs-Amazons-New-HPC-Offering</comments>
<pubDate>Sat, 17 Jul 2010 08:00:06 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Cloudy-Costs-Amazons-New-HPC-Offering</guid>
<description><![CDATA[Running the numbers on the company's HPC product.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[U of R Researchers Excited to Use New Supercomputer on Campus
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=U-R-Researchers-Excited-to-Use-New-Supercomputer-on-Campus</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=U-R-Researchers-Excited-to-Use-New-Supercomputer-on-Campus</comments>
<pubDate>Fri, 16 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=U-R-Researchers-Excited-to-Use-New-Supercomputer-on-Campus</guid>
<description><![CDATA[Canadian super will be tapped for tar sands research.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Apache Lucene Directory update]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Apache-Lucene-Directory-update</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Apache-Lucene-Directory-update</comments>
<pubDate>Thu, 15 Jul 2010 08:00:36 CDT</pubDate>
<dc:creator></dc:creator>
<category>IBM ObjectGrid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Apache-Lucene-Directory-update</guid>
<description><![CDATA[I've checked in what looks like a pretty good Directory implementation for now. The current version is configurable in terms of whether to use block compression and block size itself. I've changed the way WXS maps are used to use...<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[UTC SimCenter Called ‘Gold Mine’ for Local Economy
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=UTC-SimCenter-Called-Gold-Mine-Local-Economy</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=UTC-SimCenter-Called-Gold-Mine-Local-Economy</comments>
<pubDate>Thu, 15 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=UTC-SimCenter-Called-Gold-Mine-Local-Economy</guid>
<description><![CDATA[University research center could become economic catalyst for Chattanooga.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Intel Claims Fastest Transition of Server Market, Ever
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Intel-Claims-Fastest-Transition-Server-Market-Ever</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Intel-Claims-Fastest-Transition-Server-Market-Ever</comments>
<pubDate>Thu, 15 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Intel-Claims-Fastest-Transition-Server-Market-Ever</guid>
<description><![CDATA[Chip maker reports $2.9 billion profit for quarter.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Summer Language Seminar: The R Project
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Summer-Language-Seminar-R-Project</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Summer-Language-Seminar-R-Project</comments>
<pubDate>Thu, 15 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Summer-Language-Seminar-R-Project</guid>
<description><![CDATA[The R language is more than just a statistical plotting tool.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[YeSQL: An Overview of the Various Query Semantics in the Post Only-SQL World
		]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=YeSQL-Overview--Various-Query-Semantics-in-Post-OnlySQL-World</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=YeSQL-Overview--Various-Query-Semantics-in-Post-OnlySQL-World</comments>
<pubDate>Thu, 15 Jul 2010 08:00:03 CDT</pubDate>
<dc:creator></dc:creator>
<category>GigaSpaces</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=YeSQL-Overview--Various-Query-Semantics-in-Post-OnlySQL-World</guid>
<description><![CDATA[The NoSQL movement faults the SQL query language as the source of many of the scalability issues that we face today with traditional database approach. I think that the main reason so many people have come to see SQL as...<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Cloud Failure – Files cannot be downloaded from Box.net
		]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Cloud-Failure-Files-cannot-be-downloaded-from-Boxnet</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Cloud-Failure-Files-cannot-be-downloaded-from-Boxnet</comments>
<pubDate>Wed, 14 Jul 2010 08:00:22 CDT</pubDate>
<dc:creator></dc:creator>
<category>all</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Cloud-Failure-Files-cannot-be-downloaded-from-Boxnet</guid>
<description><![CDATA[Again the ugly issue of what do you do when the cloud goes wrong rears it&amp;#8217;s head. Right now if you login to box.net and try and download a file you cannot download a file. Instead you get a screen like the below. I&amp;#8217;m sure Box are aware of this, but it again shows you [...]<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[The Green Corollary to Moore's Law
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Green-Corollary-to-Moores-Law</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Green-Corollary-to-Moores-Law</comments>
<pubDate>Wed, 14 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Green-Corollary-to-Moores-Law</guid>
<description><![CDATA[Researcher finds electrical efficiency of computing parallels Moore's Law.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Amazon Adds HPC Capability to EC2
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Amazon-Adds-HPC-Capability-to-EC2</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Amazon-Adds-HPC-Capability-to-EC2</comments>
<pubDate>Wed, 14 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Amazon-Adds-HPC-Capability-to-EC2</guid>
<description><![CDATA[Amazon tailors new offering for high performance computing customers.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Supercomputers Say BP Oil Spill Will Spread Up the East Coast
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Supercomputers-Say-BP-Oil-Spill-Will-Spread-Up-East-Coast</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Supercomputers-Say-BP-Oil-Spill-Will-Spread-Up-East-Coast</comments>
<pubDate>Tue, 13 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Supercomputers-Say-BP-Oil-Spill-Will-Spread-Up-East-Coast</guid>
<description><![CDATA[Models predict oil spill could reach Carolinas, Georgia and Northern Florida by October.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[test
		]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=test-2</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=test-2</comments>
<pubDate>Mon, 12 Jul 2010 08:00:03 CDT</pubDate>
<dc:creator></dc:creator>
<category>GigaSpaces</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=test-2</guid>
<description><![CDATA[test<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Amazon APIs as cloud standards? Not so fast
                ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Amazon-APIs-as-cloud-standards-Not-so-fast</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Amazon-APIs-as-cloud-standards-Not-so-fast</comments>
<pubDate>Sat, 10 Jul 2010 08:00:24 CDT</pubDate>
<dc:creator></dc:creator>
<category>Cloud Computing</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Amazon-APIs-as-cloud-standards-Not-so-fast</guid>
<description><![CDATA[Some people consider Amazon's APIs to be the de facto cloud computing API standard. I don't agree for several reasons--not the least of which is that it's too early for cloud standards in the first place.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Japanese Supercomputer Ranked 1st in Little Green500 List
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Japanese-Supercomputer-Ranked-1st-in-Little-Green500-List</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Japanese-Supercomputer-Ranked-1st-in-Little-Green500-List</comments>
<pubDate>Fri, 09 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Japanese-Supercomputer-Ranked-1st-in-Little-Green500-List</guid>
<description><![CDATA[Grape-DR machine delivers 815 megaflops per watt.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[NEC Aims to Double Supercomputer Share by 2014 on Europe Sales
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=NEC-Aims-to-Double-Supercomputer-Share-by-2014-on-Europe-Sales</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=NEC-Aims-to-Double-Supercomputer-Share-by-2014-on-Europe-Sales</comments>
<pubDate>Fri, 09 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=NEC-Aims-to-Double-Supercomputer-Share-by-2014-on-Europe-Sales</guid>
<description><![CDATA[Computer maker looks to tap rising demand for HPC in Germany, France, and the UK.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[HP Heading for HPC Top Ten?
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=HP-Heading-HPC-Top-Ten</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=HP-Heading-HPC-Top-Ten</comments>
<pubDate>Thu, 08 Jul 2010 08:00:05 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=HP-Heading-HPC-Top-Ten</guid>
<description><![CDATA[Multi-petaflop TSUBAME super at Tokyo Tech will sport HP hardware.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Google Patents Liquid-Cooled ‘Server Sandwich’
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Google-Patents-LiquidCooled-Server-Sandwich</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Google-Patents-LiquidCooled-Server-Sandwich</comments>
<pubDate>Thu, 08 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Google-Patents-LiquidCooled-Server-Sandwich</guid>
<description><![CDATA[Custom motherboard assembly is latest innovation from search giant.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[The World According to Jim Goodnight: Blade Switch Slashes Job Times
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=World-According-to-Jim-Goodnight-Blade-Switch-Slashes-Job-Times</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=World-According-to-Jim-Goodnight-Blade-Switch-Slashes-Job-Times</comments>
<pubDate>Wed, 07 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=World-According-to-Jim-Goodnight-Blade-Switch-Slashes-Job-Times</guid>
<description><![CDATA[SAS unveils patent-pending In-Memory Analytics platform,<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Intel Defends iCore Performance vs Parallel Processing
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Intel-Defends-iCore-Performance-vs-Parallel-Processing</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Intel-Defends-iCore-Performance-vs-Parallel-Processing</comments>
<pubDate>Wed, 07 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Intel-Defends-iCore-Performance-vs-Parallel-Processing</guid>
<description><![CDATA[A recent report found the Core i7 couldn't match the parallel processing performance of an NVIDIA GPU.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Apache Lucene Store plugin for IBM WebSphere eXtreme Scale]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Apache-Lucene-Store-plugin-IBM-WebSphere-eXtreme-Scale</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Apache-Lucene-Store-plugin-IBM-WebSphere-eXtreme-Scale</comments>
<pubDate>Sat, 03 Jul 2010 08:00:53 CDT</pubDate>
<dc:creator></dc:creator>
<category>IBM ObjectGrid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Apache-Lucene-Store-plugin-IBM-WebSphere-eXtreme-Scale</guid>
<description><![CDATA[I'm written a lucene store plugin for IBM WebSphere eXtreme Scale. It's a new Lucene Directory class that uses WXS for the indexes in a remote data grid. I used my wxsutils jar also. You can find it with source...<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Implementation details of the Apache Lucene WebSphere eXtreme Scale store]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Implementation-details--Apache-Lucene-WebSphere-eXtreme-Scale-store</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Implementation-details--Apache-Lucene-WebSphere-eXtreme-Scale-store</comments>
<pubDate>Sat, 03 Jul 2010 08:00:52 CDT</pubDate>
<dc:creator></dc:creator>
<category>IBM ObjectGrid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Implementation-details--Apache-Lucene-WebSphere-eXtreme-Scale-store</guid>
<description><![CDATA[I used 4 maps. MetaData Map This map uses the file name as the key and the value is a FileMetaData object. The FileMetaData object has things like lastmodificationtime and number of bytes. Chunk Map This has a String key...<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Jack Dongarra Interview by Sander Olson
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Jack-Dongarra-Interview-by-Sander-Olson</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Jack-Dongarra-Interview-by-Sander-Olson</comments>
<pubDate>Fri, 02 Jul 2010 08:00:05 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Jack-Dongarra-Interview-by-Sander-Olson</guid>
<description><![CDATA[Ten-teraflop laptops and exaflop supercomputers by 2020.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Renting HPC: What's Cloud Got to Do with It?
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Renting-HPC-Whats-Cloud-Got-to-Do-with-It</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Renting-HPC-Whats-Cloud-Got-to-Do-with-It</comments>
<pubDate>Fri, 02 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Renting-HPC-Whats-Cloud-Got-to-Do-with-It</guid>
<description><![CDATA[HPC-as-a-Service is not new and not very cloud-like.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[Blowing The Doors Off HPC Speed-up Numbers
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=Blowing-Doors-Off-HPC-Speedup-Numbers</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=Blowing-Doors-Off-HPC-Speedup-Numbers</comments>
<pubDate>Thu, 01 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=Blowing-Doors-Off-HPC-Speedup-Numbers</guid>
<description><![CDATA[The CPU-GPU performance wars bring out the pitfalls of benchmarking.<br/><br/>0 Vote(s) ]]></description>
</item>

<item>
<title><![CDATA[IBM Believes in Commoditised HPC for BI
      ]]></title>
<link>http://smetube.com/TheGridPlace/story.php?title=IBM-Believes-in-Commoditised-HPC-BI</link>
<comments>http://smetube.com/TheGridPlace/story.php?title=IBM-Believes-in-Commoditised-HPC-BI</comments>
<pubDate>Thu, 01 Jul 2010 08:00:04 CDT</pubDate>
<dc:creator></dc:creator>
<category>General Grid</category>
<guid>http://smetube.com/TheGridPlace/story.php?title=IBM-Believes-in-Commoditised-HPC-BI</guid>
<description><![CDATA[Business intelligence moves off the desktop.<br/><br/>0 Vote(s) ]]></description>
</item>

</channel>
</rss>
