有没有更好的方法在Java集合对象上实现有价值的压缩?

有没有更好的方法在Java集合对象上实现有价值的压缩?,java,performance,collections,compression,gzip,Java,Performance,Collections,Compression,Gzip,我目前正在寻找不同的替代方案,以提高现有web应用程序搜索操作的性能。在考虑不同的替代方案之前,我试图找出现有压缩系统的最大可用改进 在现有系统中,响应用户搜索返回的结果集是使用内部和外部数据资源制定的。结果集由嵌套的Java集合对象组成。我想压缩和传输对象,并在需要时解压缩它们。我们要压缩的数据是多种多样的,从浮点向量到字符串再到日期 我试用了一个Java实用程序来压缩和扩展集合对象。我尝试了下面的代码块,试图检查Java压缩将如何帮助减少结果集大小,以及它是否会改善网络上的数据传输。我使用了

我目前正在寻找不同的替代方案,以提高现有web应用程序搜索操作的性能。在考虑不同的替代方案之前,我试图找出现有压缩系统的最大可用改进

在现有系统中,响应用户搜索返回的结果集是使用内部和外部数据资源制定的。结果集由嵌套的Java集合对象组成。我想压缩和传输对象,并在需要时解压缩它们。我们要压缩的数据是多种多样的,从浮点向量到字符串再到日期

我试用了一个Java实用程序来压缩和扩展集合对象。我尝试了下面的代码块,试图检查Java压缩将如何帮助减少结果集大小,以及它是否会改善网络上的数据传输。我使用了基于Gzip的压缩

package com.soft.java.Objectcompress;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 
 * The Class ObjectCompressionUtil.
 * 
 * @param <T> the generic type of the serializable object to be compressed
 */
public class ObjectCompressionUtil<T extends Serializable> {

    /**
     * The compressObject(final T objectToCompress) takes the object 
     * to compress and returns the compressed object as byte array.
     * 
     * @param objectToCompress the object to compress
     * @return the compressed object as byte array
     * @throws IOException Signals that an I/O exception has occurred.
     */
    public byte[] compressObject(final T objectToCompress) throws IOException {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        /*Create a new GZIPOutputStream with a default buffer size.*/
        final GZIPOutputStream gz = new GZIPOutputStream(baos);
        /*Create an ObjectOutputStream that writes to the specified GZIPOutputStream.*/ 
        final ObjectOutputStream oos = new ObjectOutputStream(gz);

        try {
          /*Writes the specified object to be compressed to the ObjectOutputStream and flush it, using writeObject(Object obj)*/
            oos.writeObject(objectToCompress);
          /*flush() API methods of ObjectOutputStream*/
            oos.flush();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        /*Closes both the GZIPOutputStream and the ObjectOutputStream, using their close() API methods.*/
        finally {
            oos.close();
        }

        byte[] bytes = baos.toByteArray();

        return bytes;
    }

    /**
     * The expandObject(final T objectToExpand, final InputStream instream) method takes 
     * the object to expand and an InputStream and returns the expanded object.
     * 
     * @param objectToExpand the object to expand
     * @param instream the input stream
     * @return the expanded object
     * @throws IOException Signals that an I/O exception has occurred.
     * @throws ClassNotFoundException the class not found exception
     */
    public T expandObject(byte[] objectToExpand) throws IOException,ClassNotFoundException {
        ByteArrayInputStream bais = new ByteArrayInputStream(objectToExpand);
      /*Creates a new GZIPInputStream with a default buffer size.*/
        final GZIPInputStream gs = new GZIPInputStream(bais);
      /*Creates an ObjectInputStream that reads from the specified GZIPInputStream.*/
        final ObjectInputStream ois = new ObjectInputStream(gs);

        /*Reads the object to expand from the ObjectInputStream, with readObject() API method of ObjectInputStream.*/
        try {
            @SuppressWarnings("unchecked")
            T expandedObject = (T) ois.readObject();
            //MyObject myObj1 = (MyObject) objectIn.readObject();

            /*Returns the expanded object*/
            return expandedObject;
        } finally {
            /*Closes both the GZIPInputStream and the ObjectInputStream, using their close() API methods.*/
            gs.close();
            ois.close();
            bais.close();
        }
    }
}
package com.soft.java.Objectcompress;
导入java.io.ByteArrayInputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.io.Serializable;
导入java.util.zip.gzip输入流;
导入java.util.zip.GZIPOutputStream;
导入java.io.InputStream;
导入java.io.OutputStream;
/**
* 
*类ObjectCompressionUtil。
* 
*@param要压缩的可序列化对象的泛型类型
*/
公共类ObjectCompressionUtil{
/**
*compressObject(最终的T objectToCompress)接受该对象
*压缩并将压缩对象作为字节数组返回。
* 
*@param object压缩要压缩的对象
*@将压缩对象作为字节数组返回
*@IOException表示发生了I/O异常。
*/
公共字节[]压缩对象(最终T objectToCompress)引发IOException{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
/*创建一个具有默认缓冲区大小的新GZIPOutputStream*/
最终GZIPOutputStream gz=新的GZIPOutputStream(bas);
/*创建一个ObjectOutputStream,用于写入指定的GziOutputStream。*/
最终ObjectOutputStream oos=新ObjectOutputStream(gz);
试一试{
/*将要压缩的指定对象写入ObjectOutputStream,并使用writeObject(object obj)刷新它*/
oos.writeObject(objectToCompress);
/*ObjectOutputStream的flush()API方法*/
oos.flush();
}
捕获(例外e){
e、 printStackTrace();
}
/*使用GZIPOutputStream和ObjectOutputStream的close()API方法关闭它们*/
最后{
oos.close();
}
byte[]bytes=baos.toByteArray();
返回字节;
}
/**
*expandObject(final T objectToExpand,final InputStream instream)方法采用
*要展开的对象和InputStream,并返回展开的对象。
* 
*@param objectToExpand要展开的对象
*@param流入输入流
*@返回展开的对象
*@IOException表示发生了I/O异常。
*@throws ClassNotFoundException类未找到异常
*/
公共T expandObject(字节[]objectToExpand)引发IOException,ClassNotFoundException{
ByteArrayInputStream bais=新的ByteArrayInputStream(objectToExpand);
/*创建具有默认缓冲区大小的新GZIPInputStream*/
最终GZIPInputStream gs=新GZIPInputStream(BAI);
/*创建从指定的GZIPInputStream读取的ObjectInputStream*/
最终ObjectInputStream ois=新ObjectInputStream(gs);
/*使用ObjectInputStream的readObject()API方法从ObjectInputStream读取要展开的对象*/
试一试{
@抑制警告(“未选中”)
T expandedObject=(T)ois.readObject();
//MyObject myObj1=(MyObject)objectIn.readObject();
/*返回展开的对象*/
返回展开对象;
}最后{
/*使用GZIPInputStream和ObjectInputStream的close()API方法同时关闭它们*/
gs.close();
ois.close();
bais.close();
}
}
}
我也在这个论坛上检查了类似的问题,有一些问题没有明确回答我的问题。所以我想发布这个问题

有没有更好的方法来实现对结果集的有价值的压缩?我把易压缩性和解压缩速度视为最重要的因素,最佳压缩比视为第二选择

使用的流的类型/组合是否会对预期结果产生影响

是否有其他定制/第三方压缩算法提供更好的性能改进

更新-一些可能的潜在客户相关问题

  • Java中的searilized对象的压缩通常不是很好。A. Java对象有许多不需要的附加信息。如果你 拥有数以百万计的对象,这项开销会持续数百万次

  • 如果可能,将对象写入数据库、数据存储或文件,然后 使用缓存将经常使用的对象保留在内存中

  • 如果大小很重要,您可能希望有一个简单的序列化 你自己的。使用ObjectOutputStream可能不是答案。 这是因为ObjectOutputStream的开销很大 小对象要大得多。流格式包含许多 与类型相关的元数据。如果要序列化小对象,则 强制元数据将使压缩算法难以执行 “收支平衡”,即使您实现了自定义seri