Как создать двоичный объект BLOB-объектов в Java определенного размера?

Я пытаюсь создать непрозрачный 64-битный двоичный двоичный объект, закодированный с любым мусором / случайным содержимым, а также пытаюсь сделать его таким образом, чтобы я мог указать размер в килобайтах для сгустка данных, которые будут генерироваться в нем.

Целью этого является измерение производительности записи приложения БД, поддерживающего тип данных BLOB-объектов (например, C*). BLOB-объект не обязательно должен быть уникальным, поэтому его можно создать один раз и просто повторно использовать, чтобы избежать задержки на стороне клиента из-за создания GC и объекта.

Я наивно пытался использовать ByteBuffer.allocateDirect(bSize) думая, что я мог бы просто использовать любой мусор, который он заберет из памяти, однако я сомневаюсь, что этот подход работает.

Есть предложения, как этого добиться?

4 ответа

Если вы используете Linux, этот маленький трюк из командной строки быстро создает фиктивные файлы:

 dd if=/dev/zero of=FileName bs=1024 count=1000

count * bs = размер файла

Затем:

String sql = "INSERT INTO table (blob) VALUES (?)";
PreparedStatement stmt = conn.prepareStatement(sql);
File blob = new File("path_to_FileName");
FileInputStream   fis = new FileInputStream(blob);
stmt.setBinaryStream(1, fis, (int) blob.length());
stmt.execute();

Создайте пользовательскую реализацию InputStream для получения случайных данных:

import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

public class RandomInputStream extends InputStream
{
    private int available;
    private Random random = new Random();

    public RandomInputStream(final int totalSize)
    {
        this.available = totalSize;
    }

    @Override
    public int read() throws IOException
    {
        if(available == 0)
            return -1;
        --available;
        return random.nextInt(256);
    }


    @Override
    public int available() throws IOException
    {
        return available;
    }
}

А затем просто используйте его как обычно:

InputStream is = new RandomInputStream(1024*1024);
stmt.setBinaryStream(1, is, is.available());

Это было бы самым быстрым возможным решением.

Если вам нужны случайные данные, вы можете использовать Random.nextBytes(byte[]); однако такие системы редко заботятся о содержимом, поэтому вы можете просто использовать все нули.

byte[] blob = new byte[byteCount];

// optionally
// new Random().nextBytes(blob);

stmt.setBinaryStream(1, new ByteArrayInputStream(blob), blob.length);

byte [] blob = new byte [byteCount];

// опционально // new Random (). nextBytes (blob);

stmt.setBinaryStream (1, новый ByteArrayInputStream(blob), blob.length);

Другие вопросы по тегам