Performance 将可序列化对象写入磁盘时出现性能问题

Performance 将可序列化对象写入磁盘时出现性能问题,performance,io,serializable,Performance,Io,Serializable,我有一个可以处理数据列表的应用程序。数据分为三类,如下所示。我的问题是,读取和写入数据到磁盘的时间太长,应用程序在大约1000个条目之后无法使用。例如1000张抽认卡。磁盘上的文件大约为200K,加载大约需要6秒钟。令人印象深刻的每秒35k。我希望能够支持成千上万的条目,但很明显,用户的注意力会随着一分钟的等待而暂停。在数据被读取并加载到滚动视图中的linerlayout以及屏幕刷新之后,花费了惊人的长时间。这大约是六秒钟中的三秒钟。我一直在寻找不同的替代方案,如parcelable(无法写入磁

我有一个可以处理数据列表的应用程序。数据分为三类,如下所示。我的问题是,读取和写入数据到磁盘的时间太长,应用程序在大约1000个条目之后无法使用。例如1000张抽认卡。磁盘上的文件大约为200K,加载大约需要6秒钟。令人印象深刻的每秒35k。我希望能够支持成千上万的条目,但很明显,用户的注意力会随着一分钟的等待而暂停。在数据被读取并加载到滚动视图中的linerlayout以及屏幕刷新之后,花费了惊人的长时间。这大约是六秒钟中的三秒钟。我一直在寻找不同的替代方案,如parcelable(无法写入磁盘)Kyro和其他产品,但基准测试并没有那么令人印象深刻。如果有人能给我提供建议或指导,我将不胜感激。代码工作得很好——只是速度很慢。下面是这些类的数据结构以及我用来写和读的代码

谢谢

克里斯

公共类iList扩展活动实现可序列化{
字符串列表名;
最后位置;
长期保存;
字符串列表路径;
List listLayout=新建ArrayList();
列表操作历史记录=新建ArrayList();
ListsetList=新的ArrayList();
公共类iSet扩展活动实现可序列化{
私有静态最终长serialVersionUID=2L;
字符串集合名;
List setObjectis=new ArrayList();
List setLists=新建ArrayList();
布尔hasList=false;
int listCount=0;
公共类Objecti扩展活动实现可序列化{
私有静态最终长serialVersionUID=2L;
私有字符串objectName;
私有int对象类型;
私有字符串字符串值;
私有日期值;
私人浮动价值;
私有整数值;
私有图像查看图像;
公共iList读取列表(字符串路径名){
文件f=新文件(路径名);
iList list=新的iList();
ObjectInputStream ObjectInputStream=null;
试一试{
FileInputStream fis=新的FileInputStream(路径名);
如果(fis.available()>0){
ObjectInputStream ois=新ObjectInputStream(fis);
list=(iList)ois.readObject();
ois.close();
}
}捕获(例外e){
e、 printStackTrace();
}最后{
if(objectinputstream!=null){
}
}
退货清单;
}
公共void保存(字符串文件路径){
试一试{
文件f=新文件(文件路径);
FileOutputStream fout=新的FileOutputStream(filePath);
ObjectOutputStream oos=新的ObjectOutputStream(fout);
oos.writeObject(本);
oos.flush();
oos.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}

查看类结构。您可能会想到以下内容 1.减少被序列化的数据成员数量。这可以通过为此提供良好的设计来实现。 2.以下是我可以推断出的关联关系 iSet={*objectI,*iList}
iList={*iSet}
我无法理解为什么需要这种类型的关联。这看起来像是一个循环,可能会导致重复数据被序列化。通过提供设计,您可以只序列化所需的最小数据。剩余数据可以在反序列化完成后重新计算。这将缩短每个IO操作。

经过多次重设后我得出的答案是,如果不亲自操作,就无法加快objectinput/output的速度。由于我的数据结构,一个iList将具有多种iSet类型,其中有多个对象,其中的数据驻留在该对象中。因此,我将所有对象写入.txt文件,当我需要恢复该对象时,我会读取它们从.txt中删除,然后将列表重新放在一起。结果是极端的,速度从15到20倍不等,超过了我的要求。

感谢您的想法Saravanan。让我对您的评论发表一些看法,看看是否可以改进设计。如果我有什么想法,我会告诉您。
public class iList extends Activity implements Serializable {

String listName;
int lastPosition;
long dateSaved;
String listPath;
List<iSet> listLayout=new ArrayList<iSet>();
List<String> operationsHistory = new ArrayList<String>();
List<iSet>setList= new ArrayList<iSet>();

public class iSet extends Activity implements Serializable {
private static final long serialVersionUID = 2L;
String setName;
List<Objecti> setObjectis = new ArrayList<Objecti>();
List<iList> setLists = new ArrayList<iList>();
boolean hasList=false;
int listCount=0;

public class Objecti extends Activity implements Serializable {
private static final long serialVersionUID = 2L;
private String objectName;
private int objectType;
private String stringValue;
private Date dateValue;
private float floatValue;
private int integerValue;
private ImageView image;

  public iList readList(String pathName) {
    File f = new File(pathName);
    iList list = new iList();
    ObjectInputStream objectinputstream = null;
    try {
        FileInputStream fis = new FileInputStream(pathName);
        if (fis.available() > 0) {
            ObjectInputStream ois = new ObjectInputStream(fis);
            list = (iList) ois.readObject();
            ois.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (objectinputstream != null) {
        }
    }
    return list;

}

public void save(String filePath){
    try {
        File f = new File(filePath);
        FileOutputStream fout = new FileOutputStream(filePath);
        ObjectOutputStream oos = new ObjectOutputStream(fout);
        oos.writeObject(this);
        oos.flush();
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}