【问题标题】:performance issue with writing serializable objects to disk将可序列化对象写入磁盘的性能问题
【发布时间】:2015-03-22 06:59:49
【问题描述】:

我有一个可以处理数据列表的应用。数据分为三个类别,如下所示。我的问题是读取和写入数据到磁盘的时间太长,以至于应用程序在超过 1,000 个条目后仍然有用。一个例子是 1,000 张抽认卡。磁盘上的文件大约 200K,加载大约需要 6 秒。令人印象深刻的每秒 35k。我希望能够支持数以万计的条目,但显然用户的注意力跨度会因等待一分钟而超时。在读取数据并将其加载到位于滚动视图中的 linerlayout 和屏幕刷新之后,花费了令人惊讶的长部分时间。这大约是六秒中的三秒。我一直在寻找不同的替代方案,例如 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();
    }
}

【问题讨论】:

  • 感谢您的想法 Saravanan。让我给你们的cmets一些想法,看看我是否可以改进设计。如果我有什么想法,我会告诉你的。

标签: performance io serializable


【解决方案1】:

查看类结构。你可能会想到以下 1. 减少被序列化的数据成员数。您可以通过为此提供良好的设计来做到这一点。 2.以下是我可以推断的关联关系

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

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

【讨论】:

    【解决方案2】:

    经过大量研究,我得出的答案是,如果不自己动手,就无法更快地进行对象输入/输出。由于我的数据结构,一个 iList 将有许多一种类型的 iSet,它具有多个对象,数据驻留在对象中。因此,我将所有对象写入 .txt 文件,当我需要恢复对象时,我从 .txt 中读取它们并将列表重新组合在一起。结果是极端的 - 比我的要求快 15 到 20 倍不等。

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 2011-12-14
      • 2017-10-19
      • 2018-05-31
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      相关资源
      最近更新 更多