我已获得在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
中答案 0 :(得分:0)
如果我理解正确,你有50K记录,其中大部分都无法加载到RAM中,而且数据架构有利于数据READ over data WRITE。
如果是这种情况,只需使用数据库。索引要用于快速检索数据的字段(最好是<= 2),如:
db.execSQL( "Create Index MyTable_StartDate_idx ON MyTable(StartDate);"
..在合理的时间内,你的表现将远远超过你能做的任何事情。