snappy-java/README.md

150 lines
7.4 KiB
Markdown
Raw Normal View History

2012-09-06 03:36:03 +02:00
The snappy-java is a Java port of the snappy
<http://code.google.com/p/snappy/>, a fast C++ compresser/decompresser developed by Google.
## Features
* Fast compression/decompression tailored to 64-bit CPU architecture.
* JNI-based implementation to achieve comparable performance to the native C++ version.
* Although snappy-java uses JNI, it can be used safely with multiple class loaders (e.g. Tomcat, etc.).
2013-10-21 05:10:19 +02:00
* Portable across various operating systems; Snappy-java contains native libraries built for Window/Mac/Linux (64-bit). snappy-java loads one of these libraries according to your machine environment (It looks system properties, `os.name` and `os.arch`).
* Simple usage. Add the snappy-java-(version).jar file to your classpath. Then call compression/decompression methods in `org.xerial.snappy.Snappy`.
* [Framing-format support](http://snappy.googlecode.com/svn/trunk/framing_format.txt) (Since 1.1.0 version)
2013-11-07 16:20:29 +01:00
* OSGi support
2013-10-21 05:10:19 +02:00
* [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0). Free for both commercial and non-commercial use.
2012-09-06 03:36:03 +02:00
## Performance
* Snappy's main target is very high-speed compression/decompression with reasonable compression size. So the compression ratio of snappy-java is modest and about the same as `LZF` (ranging 20%-100% according to the dataset).
2012-09-06 03:44:09 +02:00
* Here are some [benchmark results](https://github.com/ning/jvm-compressor-benchmark/wiki), comparing
2012-09-06 03:36:03 +02:00
snappy-java and the other compressors
`LZO-java`/`LZF`/`QuickLZ`/`Gzip`/`Bzip2`. Thanks [Tatu Saloranta @cotowncoder](http://twitter.com/#!/cowtowncoder) for providing the benchmark suite.
2013-11-15 16:25:56 +01:00
* The benchmark result indicates snappy-java is the fastest compreesor/decompressor in Java
* <http://ning.github.com/jvm-compressor-benchmark/results/canterbury-roundtrip-2011-07-28/index.html>
2012-09-06 03:36:03 +02:00
* The decompression speed is twice as fast as the others:
2013-11-15 16:25:56 +01:00
* <http://ning.github.com/jvm-compressor-benchmark/results/canterbury-uncompress-2011-07-28/index.html>
2012-09-06 03:36:03 +02:00
## Download
2013-10-17 07:41:58 +02:00
* [Release Notes](Milestone.md)
2012-09-06 03:44:09 +02:00
The current stable version is available from here:
2014-06-12 04:02:08 +02:00
* Release version: http://central.maven.org/maven2/org/xerial/snappy/snappy-java/
* (Old archives are here: http://code.google.com/p/snappy-java/downloads/list)
2012-09-07 04:32:37 +02:00
* Snapshot version (the latest beta version): https://oss.sonatype.org/content/repositories/snapshots/org/xerial/snappy/snappy-java/
2013-10-17 04:16:44 +02:00
2013-10-17 07:41:58 +02:00
For Maven user, see [pom.xml example](#using-with-maven).
2012-09-06 03:36:03 +02:00
## Usage
First, import `org.xerial.snapy.Snappy` in your Java code:
2013-03-28 09:34:29 +01:00
```java
import org.xerial.snappy.Snappy;
```
2012-09-06 03:36:03 +02:00
Then use `Snappy.compress(byte[])` and `Snappy.uncompress(byte[])`:
2013-03-28 09:34:29 +01:00
```java
String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of "
2012-09-06 03:36:03 +02:00
+ "Snappy, a fast compresser/decompresser.";
2013-03-28 09:34:29 +01:00
byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
byte[] uncompressed = Snappy.uncompress(compressed);
2012-09-06 03:36:03 +02:00
2013-03-28 09:34:29 +01:00
String result = new String(uncompressed, "UTF-8");
System.out.println(result);
```
2012-09-06 03:36:03 +02:00
In addition, high-level methods (`Snappy.compress(String)`, `Snappy.compress(float[] ..)` etc. ) and low-level ones (e.g. `Snappy.rawCompress(.. )`, `Snappy.rawUncompress(..)`, etc.), which minimize memory copies, can be used.
2012-09-06 03:36:03 +02:00
### Stream-based API
Stream-based compressor/decompressor `SnappyFramedOutputStream`/`SnappyFramedInputStream` are also available for reading/writing large data sets.
2012-09-06 03:36:03 +02:00
* See also [Javadoc API](https://oss.sonatype.org/service/local/repositories/releases/archive/org/xerial/snappy/snappy-java/1.1.0/snappy-java-1.1.0-javadoc.jar/!/index.html)
2013-03-19 16:10:02 +01:00
2012-09-06 03:36:03 +02:00
### Setting classpath
If you have snappy-java-(VERSION).jar in the current directory, use `-classpath` option as follows:
2012-09-06 03:45:59 +02:00
$ javac -classpath ".;snappy-java-(VERSION).jar" Sample.java # in Windows
or
$ javac -classpath ".:snappy-java-(VERSION).jar" Sample.java # in Mac or Linux
2012-09-06 03:36:03 +02:00
### Using with Maven
2012-09-06 03:44:09 +02:00
* Snappy-java is available from Maven's central repository: <http://repo1.maven.org/maven2/org/xerial/snappy/snappy-java>
2012-09-06 03:36:03 +02:00
Add the following dependency to your pom.xml:
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>(version)</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
### Using with sbt
```
libraryDependencies += "org.xerial.snappy" % "snappy-java" % "(version)"
```
2012-09-06 03:36:03 +02:00
## Public discussion group
2012-09-06 03:44:09 +02:00
Post bug reports or feature request to the Issue Tracker: <https://github.com/xerial/snappy-java/issues>
2012-09-06 03:36:03 +02:00
Public discussion forum is here: <http://groups.google.com/group/xerial?hl=en Xerial Public Discussion Group>
## Building from the source code
2012-09-06 03:44:09 +02:00
See the [installation instruction](https://github.com/xerial/snappy-java/blob/develop/INSTALL). Building from the source code is an option when your OS platform and CPU architecture is not supported. To build snappy-java, you need Git, JDK (1.6 or higher), Maven (3.x or higher is required), g++ compiler (mingw in Windows) etc.
2012-09-06 03:36:03 +02:00
$ git clone https://github.com/xerial/snappy-java.git
$ cd snappy-java
$ make
2013-08-13 16:49:22 +02:00
When building on Solaris use
$ gmake
2012-09-06 03:36:03 +02:00
A file `target/snappy-java-$(version).jar` is the product additionally containing the native library built for your platform.
2013-03-28 09:34:29 +01:00
## Building linux amd64 binary
2013-03-28 09:41:45 +01:00
snappy-java tries to static link libstdc++ to increase the availability for various Linux versions. However, standard distributions of 64-bit Linux OS rarely provide libstdc++ compiled with `-fPIC` option. I currently uses custom g++ compiled with the following options:
$ ./configure --prefix=$HOME/local --with-gmp=$HOME/local --with-mpfr=$HOME/local --with-mpc=$HOME/local --with-ppl=$HOME/local --with-cloog=$HOME/local CXXFLAGS=-fPIC CFLAGS=-fPIC
2013-03-28 09:34:29 +01:00
This g++ build enables static linking of libstdc++. For more infomation on building GCC, see GCC's home page.
## Cross-compiling for other platforms
The Makefile contains rules for cross-compiling the native library for other platforms so that the snappy-java JAR can support multiple platforms. For example, to build the native libraries for x86 Linux, x86 and x86-64 Windows, and soft- and hard-float ARM:
$ make linux32 win32 win64 linux-arm linux-armhf
If you append `snappy` to the line above, it will also build the native library for the current platform and then build the snappy-java JAR (containing all native libraries built so far).
Of course, you must first have the necessary cross-compilers and development libraries installed for each target CPU and OS. For example, on Ubuntu 12.04 for x86-64, install the following packages for each target:
* linux32: `sudo apt-get install g++-multilib libc6-dev-i386 lib32stdc++6`
* win32: `sudo apt-get install g++-mingw-w64-i686`
* win64: `sudo apt-get install g++-mingw-w64-x86-64`
* arm: `sudo apt-get install g++-arm-linux-gnueabi`
* armhf: `sudo apt-get install g++-arm-linux-gnueabihf`
Unfortunately, cross-compiling for Mac OS X is not currently possible; you must compile within OS X.
2012-09-07 04:57:59 +02:00
If you are using Mac and openjdk7 (or higher), use the following option:
2012-09-07 04:38:05 +02:00
$ make native LIBNAME=libsnappyjava.dylib
2014-06-26 07:33:54 +02:00
## Running tests
$ make test
2012-09-06 03:36:03 +02:00
## Miscellaneous Notes
### Using snappy-java with Tomcat 6 (or higher) Web Server
2013-08-13 10:07:02 +02:00
Simply put the snappy-java's jar to WEB-INF/lib folder of your web application. Usual JNI-library specific problem no longer exists since snappy-java version 1.0.3 or higher can be loaded by multiple class loaders.
2012-09-06 03:36:03 +02:00
----
Snappy-java is developed by [Taro L. Saito](http://www.xerial.org/leo). Twitter [@taroleo](http://twitter.com/#!/taroleo)