gpt4 book ai didi

java - 如何将数据持久保存到磁盘,随机更新数据,并将其有效地流回 RAM?

转载 作者:行者123 更新时间:2023-11-30 09:58:02 25 4
gpt4 key购买 nike

我需要在磁盘上存储多达数千万甚至数亿条数据。每条数据包含如下信息:

id=23425
browser=firefox
ip-address=10.1.1.1
outcome=1.0

新数据的添加速度最多为每毫秒 1 个。

所以它是一组相对简单的键值对,其中的值可以是字符串、整数或 float 。有时我可能需要更新具有特定 id 的数据,将 flag 字段从 0 更改为 1。换句话说,我需要能够通过 id 进行随机键查找,并修改数据(实际上只是 float 指向“结果”字段 - 所以我永远不需要修改值的大小)。

另一个要求是我需要能够高效地从磁盘流式传输这些数据(顺序不是特别重要)。这意味着硬盘磁头不需要在磁盘上跳来跳去读取数据,而是应该在连续的磁盘 block 中读取。

我正在用 Java 编写这个。

我考虑过使用嵌入式数据库,但 DB4O 不是一个选项,因为它是 GPL 而我的其余代码不是。考虑到与 SQL 查询相互转换的开销,我还担心使用嵌入式 SQL 数据库的效率。

有人有什么想法吗?我可能必须为此构建一个自定义解决方案(我直接处理 ByteBuffers,并处理 id 查找)?

最佳答案

H2怎么样? ? License应该适合你。

  • 您可以免费使用 H2。你可以将其集成到您的应用程序中(包括商业应用),你可以分发它。
  • 文件只包含你的代码不是本许可证涵盖(它是'商业友好')。
  • 修改H2源代码必须是出版。
  • 你不需要提供H2 的源代码,如果你没有修改任何内容。

我明白了

在 22492 毫秒内插入 1000000 次(44460.252534234394 行/秒)

100000 次更新,9565 毫秒(10454.783063251438 行/秒)

来自

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Random;


/**
* @author clint
*
*/
public class H2Test {

static int testrounds = 1000000;

public static void main(String[] args) {
try {
Class.forName("org.h2.Driver");

Connection conn = DriverManager.
getConnection("jdbc:h2:/tmp/test.h2", "sa", "");
// add application code here
conn.createStatement().execute("DROP TABLE IF EXISTS TEST");
conn.createStatement().execute("CREATE TABLE IF NOT EXISTS TEST(id INT PRIMARY KEY, browser VARCHAR(64),ip varchar(16), outcome real)");
//conn.createStatement().execute("CREATE INDEX IDXall ON TEST(id,browser,ip,outcome");


PreparedStatement ps = conn.prepareStatement("insert into TEST (id, browser, ip, outcome) values (?,?,?,?)");
long time = System.currentTimeMillis();
for ( int i = 0; i < testrounds; i++ ) {
ps.setInt(1,i);
ps.setString(2,"firefox");
ps.setString(3,"000.000.000.000");
ps.setFloat(4,0);
ps.execute();
}
long last = System.currentTimeMillis() ;
System.out.println( testrounds + " insert in " + (last - time) + "ms (" + ((testrounds)/((last - time)/1000d)) + " row/sec)" );

ps.close();
ps = conn.prepareStatement("update TEST set outcome = 1 where id=?");
Random random = new Random();
time = System.currentTimeMillis();

/// randomly updadte 10% of the entries
for ( int i = 0; i < testrounds/10; i++ ) {
ps.setInt(1,random.nextInt(testrounds));
ps.execute();
}

last = System.currentTimeMillis();
System.out.println( (testrounds/10) + " updates in " + (last - time) + "ms (" + ((testrounds/10)/((last - time)/1000d)) + " row/sec)" );

conn.close();

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

关于java - 如何将数据持久保存到磁盘,随机更新数据,并将其有效地流回 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1274562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com