2016-12-03 1 views
-1

私は、一度に500個のオブジェクトをデシリアライズしたい特定の範囲のfromIndextoIndexの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; 
    }  
} 

があれば、私は思ったんだけど常に最初のオブジェクトからの読み取りを開始するのではなく、指定されたインデックスのオブジェクトを直接読み込み、そこから反復する方がよいでしょうか?

+0

MyObjectの外観についていくつかの情報を教えてください。横のフィールドは何ですか?どのくらいのネスティングがありますか?彼らは何かへの参照を共有していますか? – Ivan

+0

できません。オブジェクトストリームには、後で参照される状態を含めることができます。ランダムアクセスファイルではありません。 – EJP

+0

@Ivan MyObjectは、String、Double、Dateフィールドの束を持つシンプルなPojoクラスのクラスです。これはオブジェクトを別のシンプルなPojoオブジェクトに入れ子にしています。しかし、参照の共有はありません。 – Yog

答えて

-1

あなたが基になるストリーム内のバイト数をスキップして休息をデシリアライズすることができるようfromIndex位置から読み取っinputstream.skip次

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

     intputSteam.skip(fromIndex); 

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

のように、入力ストリーム内のバイトをスキップして試してみること必要な場所からの入力ストリームの

+2

それはできません。スリップさせるべき多くのバイトを知ることはできません。後でストリームの中でハンドルとして参照されるオブジェクトをスキップすることができます。 – EJP

+0

@Rajasuba Subramanian、これはEJPによって正しく指摘されているようには動作しませんが、これは私が探しているものです。これはinputStreamからの読み込みを開始する前にオブジェクトの数をスキップする同様のメカニズムです。 – Yog

関連する問題