0

Java を使用してデータベースから BMP (ビットマップ) イメージを作成する必要があります。問題は、10 から 100 までの膨大な整数セットがあることです。

データベース全体を bmp として表現したいと思います。テーブルあたり 10000x10000 のデータ量 (および増加中) は、int 配列で処理できるデータ量を超えています。

メモリ不足にならないように、BMP をハード ドライブにピクセル単位で直接書き込む方法はありますか?

4

2 に答える 2

1

ファイルは機能します (ピクセルごとの呼び出しは絶対に行いません。結果が出るまで何時間も待つことになります)。ただバッファが必要です。-> の行に沿ってアプリケーションを分割します

int[] buffer = new int[BUFFER_SIZE];

ResultSet data = ....;  //Forward paging result set

while(true)
{
  for(int i = 0; i < BUFFER_SIZE; i++)
  {
    //Read result set into buffer

  }
  //write buffer to cache (HEAP/File whatever)

  if(resultSetDone)
    break;
}

データベース ドライバのドキュメントを読んでください。ただし、主要なデータベースはいずれも ResultSet オブジェクトを最適化するため、メモリを気にせずにカーソルを使用できます。

そうは言っても... int[10000][10000] がメモリ不足の理由ではありません。おそらく、それらの値とアルゴリズムを使用して何をしているのかです。例:

public class Test
{
  public static void main(String... args)
  {
    int[][] ints = new int[10000][];

    System.out.println(System.currentTimeMillis() + " Start");
    for(int i = 0; i < 10000; i++)
    {
      ints[i] = new int[10000];
      for(int j = 0; j < 10000; j++)
        ints[i][j] = i*j % Integer.MAX_VALUE / 2;

      System.out.print(i);
    }
    System.out.println();
    System.out.println(Integer.valueOf(ints[500][999]) + " <- value");

    System.out.println(System.currentTimeMillis() + " Stop");
  }

}

出力 ->

1344554718676 Start
//not even listing this
249750 <- value
1344554719322 Stop

編集--または、質問を誤解した場合は、これを試してください-> http://www.java2s.com/Code/Java/Database-SQL-JDBC/LoadimagefromDerbydatabase.htm

なるほど…よく見てみろよ、俺は錆びているが、これはそれを行う方法のようだ。バッファリングを再確認します...

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test
{
  public static void main(String... args)
  {
    // 2 ^ 24 bytes, streams can be bigger, but this works...
    int size = Double.valueOf((Math.floor((Math.pow(2.0, 24.0))))).intValue();

    byte[] bytes = new byte[size];

    for(int i = 0; i < size; i++)
      bytes[i] = (byte) (i  % 255);

    ByteArrayInputStream stream = new ByteArrayInputStream(bytes); 

    File file = new File("test.io"); //kill the hard disk

    //Crappy error handling, you'd actually want to catch exceptions and recover
    BufferedInputStream in = new BufferedInputStream(stream);
    BufferedOutputStream out = null;
    byte[] buffer = new byte[1024 * 8];
    try
    {
      //You do need to check the buffer as it will have crap in it on the last read
      out = new BufferedOutputStream(new FileOutputStream(file));
      while(in.available() > 0)
      {
        int total = in.read(buffer);
        out.write(buffer, 0, total);
      }
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
    finally
    {
      if(out != null)
        try
        {
          out.flush();
          out.close();
        }
        catch (IOException e)
        {
          e.printStackTrace();
        }
    }

    System.out.println(System.currentTimeMillis() + " Start");

    System.out.println();
    System.out.println(Integer.valueOf(bytes[bytes.length - 1]) + " <- value");
    System.out.println("File size is-> " + file.length());
    System.out.println(System.currentTimeMillis() + " Stop");
  }
}
于 2012-08-09T23:27:28.223 に答える
0

ファイルとして保存できますが、これは概念的には単なる一連のバイトです。

于 2012-08-09T23:06:53.390 に答える