将可序列化对象写入磁盘的性能问题

时间:2015-03-22 06:59:49

标签: performance io serializable

我有一个可以处理数据列表的应用。数据分为三类,如下所示。我的问题是读取和写入数据到磁盘需要太长时间,以使应用程序在大约1,000个条目中有用。一个例子是1,000张抽认卡。磁盘上的文件大约为200K,加载大约需要6秒钟。令人印象深刻的35k秒。我希望能够支持数以万计的数十项参赛作品,但很明显,用户的注意力会超过一分钟的等待时间。在读取数据并将其加载到在滚动视图中的线性布局中以及屏幕刷新的时间之后,花费了相当长的时间。这是六秒钟中的大约3秒。我一直在寻找不同的选择,例如parcelable(不能写入磁盘)Kyro和其他人,但基准测试并不那么令人印象深刻。如果有人能给我建议或指导我会非常感激。代码效果很好 - 只是非常慢。以下是类的数据结构以及我用来编写和读取的代码。

谢谢,

克里斯

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();
    }
}

2 个答案:

答案 0 :(得分:0)

看着班级结构。您可能会想到以下内容 1.减少序列化数据成员的数量。这可以通过为此提供良好的设计来实现。 以下是我可以推断的关联关系

iSet = {* objectI,* iList}
iList = {* iSet}

我无法弄清楚为什么需要这种类型的关联。这看起来像一个循环,可能导致重复数据被序列化。通过提供设计,您只能序列化所需的最少数据。在完成反序列化后,您可以重新计算。这将缩短每个IO操作。

答案 1 :(得分:0)

经过大量研究后我得出的答案是,您无法自行完成对象输入/输出。由于我的数据的结构,一个iList将具有许多类型的iSet,其具有多个对象,其中数据驻留在对象中。所以我将所有对象写入.txt文件,当我需要恢复对象时,我从.txt中读取它们并再次将列表重新组合在一起。结果是极端的 - 快15到20倍,超过了我的要求。