【问题标题】:How to generate a binary blob object in java of a specific size?java - 如何在Java中生成特定大小的二进制blob对象?
【发布时间】:2014-09-20 00:29:21
【问题描述】:

我正在尝试构建一个使用任何垃圾/随机内容编码的 64 位不透明二进制 Blob,还尝试以这样一种方式制作它,以便我可以以 Kb 为单位指定要生成的数据块的大小.

它的目的是对支持 blob 数据类型(例如 C*)的数据库应用程序的写入吞吐量进行基准测试。 blob 不需要是唯一的,因此可以构造一次,然后重复使用它,以避免由于 GC 和对象创建而导致客户端延迟。

我天真地尝试过使用ByteBuffer.allocateDirect(bSize),以为我可以使用它会从内存中拾取的任何垃圾,但是我怀疑这种方法是否有效。

关于如何实现这一目标的任何建议?

【问题讨论】:

    标签: java encoding bytearray blob bytebuffer


    【解决方案1】:

    如果您使用的是 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();
    

    【讨论】:

    • 在Java(!)中为测试(!)的解决方案(!)依赖于平台是很奇怪的。
    • "blob 不需要是唯一的,因此它可以被构造一次并重复使用它以避免由于 GC 和对象创建而导致客户端延迟。"因此,进行一次系统调用来创建 blob,然后使用已创建的文件在 Java 中进行所有测试。一点都不奇怪
    • 好的,用IO延迟代替GC延迟,也不是很好。
    【解决方案2】:

    如果您需要随机数据,您可以使用 Random.nextBytes(byte[]);但是,此类系统很少会关心内容,因此您可以使用全零。

    byte[] blob = new byte[byteCount];
    
    // optionally
    // new Random().nextBytes(blob);
    
    stmt.setBinaryStream(1, new ByteArrayInputStream(blob), blob.length);
    

    【讨论】:

      【解决方案3】:

      自定义实现 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());
      

      这将是最快的解决方案。

      【讨论】:

        【解决方案4】:

        byte[] blob = 新字节[byteCount];

        // 可选 // new Random().nextBytes(blob);

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-09
          • 1970-01-01
          • 2010-09-20
          • 2014-09-20
          • 1970-01-01
          • 2021-01-23
          • 2015-12-19
          • 1970-01-01
          相关资源
          最近更新 更多