快速序列化 - Android

时间:2014-07-08 19:18:05

标签: android performance memory serialization

我已获得在Android手机上处理大量文本数据的任务。 (出于隐私原因,需要在手机上进行处理)我有一个Keyword对象,我必须与String消息进行比较这个对象包含两个ArrayList,两个int id和一个boolean,问题是我们有50000 +这些对象。在内存中保留这些对象列表会导致RAM小于1.5 GB的手机出现OutOfMemory异常。我们当前的实现是将列表序列化为file,然后根据需要逐个反序列化每个对象。通过这种实现,我们保持低内存配置文件,并将其优化为每条消息5秒的处理时间。他们希望它具有较低的内存,但理想情况下是第3或第4个过程。我并不是说这是一个可行的要求。我只是想我会问StackOverFlow的专家,看看是否有人对如何加快这一过程有任何想法。

对于序列化,我实现了外化。这是代码。

@Override
public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException
{
    groupID = input.readInt();
    keywordID = input.readInt();
    mapped = input.read() == 1;
    int length = input.readInt();
    int piecelength;
    for(int index = 0; index < length; index++)
    {
        piecelength = input.readInt();
        byte[] piece = new byte[piecelength];
        input.read(piece);
        keywordPieces.add(new String(piece));           
    }
    length = input.readInt();
    for(int index = 0; index < length; index++)
    {
        piecelength = input.readInt();
        byte[] piece = new byte[piecelength];
        input.read(piece);
        positiveKeywordPieceFragments.add(new String(piece));           
    }
}

@Override
public void writeExternal(ObjectOutput output) throws IOException
{
    output.writeInt(groupID);
    output.writeInt(keywordID);
    output.write(mapped ? 1 : 0);
    output.writeInt(keywordPieces.size());
    for(int index = 0; index < keywordPieces.size(); index++)
    {
        byte[] piece = keywordPieces.get(index).getBytes();
        output.writeInt(piece.length);  
        output.write(piece);            
    }
    output.writeInt(positiveKeywordPieceFragments.size());
    for(String s : positiveKeywordPieceFragments)
    {
        byte[] piece = s.getBytes();
        output.writeInt(piece.length);  
        output.write(piece);            
    }
}

这是文件阅读代码

input = new ObjectInputStream( new BufferedInputStream(new FileInputStream(keywordsFile)));
int length = input.readInt();
Keyword keyword;
for(int index = 0; index < length; index++)
{
    keyword = (Keyword) input.readObject();
    callback.onKeywordRead(keyword);
    keyword = null;
}

任何你能想到的事情都会加速这一点会很棒。

编辑:

当前实现之前的循环看起来像这样

for(Keyword keyword : keywords)

关键字只保存在内存中,但是,正如我上面所说,这会在填充列表时在旧设备上导致OutOfMemoryException。它存储在ArrayList

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你有50K记录,其中大部分都无法加载到RAM中,而且数据架构有利于数据READ over data WRITE。


如果是这种情况,只需使用数据库。索引要用于快速检索数据的字段(最好是<= 2),如:

  db.execSQL( "Create Index MyTable_StartDate_idx ON MyTable(StartDate);"


..在合理的时间内,你的表现将远远超过你能做的任何事情。