私は、一度に500個のオブジェクトをデシリアライズしたい特定の範囲のfromIndex
とtoIndex
の200K個のオブジェクトを含む大きな直列化オブジェクトファイルを持っています。大きなシリアライズされたファイルから指定された範囲のオブジェクトのみを効率的に逆シリアル化する方法
以下のコードは正常に動作します、しかし、それはチャックを反復処理するために時間がかかり、かつ与えられた範囲内のものだけ保存:if(i >= fromIndex && i < toIndex)
を:
public void deserializeFile(int fromIndex, int toIndex) throws FileNotFoundException, IOException
{
m_objects_list = new ArrayList<MyObject>();
ObjectInputStream inputStream = null;
try
{
BufferedInputStream bufferedStream = new BufferedInputStream(new FileInputStream("myObjects.ser"));
inputStream = new ObjectInputStream(bufferedStream);
int i=0;
int count=0;
MyObject obj = new MyObject();
while (true)
{
Object object = inputStream.readObject();
if(i >= fromIndex && i<toIndex)
{
obj = (MyObject) object;
m_objects_list.add(obj);
count++;
}
i++;
if(count == toIndex - fromIndex)
{
inputStream.close();
return;
}
}
}
catch (EOFException EOF)
{
inputStream.close();
return;
}
catch (ClassNotFoundException c)
{
System.out.println("Class not found");
c.printStackTrace();
return;
}
}
があれば、私は思ったんだけど常に最初のオブジェクトからの読み取りを開始するのではなく、指定されたインデックスのオブジェクトを直接読み込み、そこから反復する方がよいでしょうか?
MyObjectの外観についていくつかの情報を教えてください。横のフィールドは何ですか?どのくらいのネスティングがありますか?彼らは何かへの参照を共有していますか? – Ivan
できません。オブジェクトストリームには、後で参照される状態を含めることができます。ランダムアクセスファイルではありません。 – EJP
@Ivan MyObjectは、String、Double、Dateフィールドの束を持つシンプルなPojoクラスのクラスです。これはオブジェクトを別のシンプルなPojoオブジェクトに入れ子にしています。しかし、参照の共有はありません。 – Yog