- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家早上好,我有一个问题,你正好需要导入1400万条记录,其中包含一家公司的客户信息。
平面文件。 txt有2.8GB,我开发了一个java程序,逐行读取平面文件,处理信息放入一个对象中,然后插入到PostgreSQL数据库中的一个表中,主题是我做了计算在 112 分钟内插入了 100000 条记录,但问题是我插入了零件。
public static void main(String[] args) {
// PROCESSING 100,000 records in 112 minutes
// PROCESSING 1,000,000 records in 770 minutes = 18.66 hours
loadData(0L, 0L, 100000L);
}
/**
* Load the number of records Depending on the input parameters.
* @param counterInitial - Initial counter, type long.
* @param loadInitial - Initial load, type long.
* @param loadLimit - Load limit, type long.
*/
private static void loadData(long counterInitial, long loadInitial, long loadLimit){
Session session = HibernateUtil.getSessionFactory().openSession();
try{
FileInputStream fstream = new FileInputStream("C:\\sppadron.txt");
DataInputStream entrada = new DataInputStream(fstream);
BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));
String strLinea;
while ((strLinea = buffer.readLine()) != null){
if(counterInitial > loadInitial){
if(counterInitial > loadLimit){
break;
}
Sppadron spadron= new Sppadron();
spadron.setSpId(counterInitial);
spadron.setSpNle(strLinea.substring(0, 9).trim());
spadron.setSpLib(strLinea.substring(9, 16).trim());
spadron.setSpDep(strLinea.substring(16, 19).trim());
spadron.setSpPrv(strLinea.substring(19, 22).trim());
spadron.setSpDst(strLinea.substring(22, 25).trim());
spadron.setSpApp(strLinea.substring(25, 66).trim());
spadron.setSpApm(strLinea.substring(66, 107).trim());
spadron.setSpNom(strLinea.substring(107, 143).trim());
String cadenaGriSecDoc = strLinea.substring(143, strLinea.length()).trim();
String[] tokensVal = cadenaGriSecDoc.split("\\s+");
if(tokensVal.length == 5){
spadron.setSpNac(tokensVal[0]);
spadron.setSpSex(tokensVal[1]);
spadron.setSpGri(tokensVal[2]);
spadron.setSpSec(tokensVal[3]);
spadron.setSpDoc(tokensVal[4]);
}else{
spadron.setSpNac(tokensVal[0]);
spadron.setSpSex(tokensVal[1]);
spadron.setSpGri(tokensVal[2]);
spadron.setSpSec(null);
spadron.setSpDoc(tokensVal[3]);
}
try{
session.getTransaction().begin();
session.save(spadron); // Insert
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
}
}
counterInitial++;
}
entrada.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();
}
}
主要问题是如果他们在我插入前一百万条记录时检查我的代码,参数如下:loadData (0L, 0L, 1000000L);
问题是,当您插入以下记录时,在这种情况下,下一百万条记录将是:loadData (0L, 1000000L, 2000000L);
什么会导致它回滚前 1000 亿条记录,然后当计数器最近的值为 1000001 时将开始插入以下记录,有人可以给我一个更优化的插入记录的建议,知道有必要对待前面代码中显示的信息。
最佳答案
参见 How to speed up insertion performance in PostgreSQL .
您应该做的第一件事是绕过 Hibernate。 ORM 很方便,但您要为这种方便付出速度上的代价,尤其是批量操作时。
您可以使用 JDBC PreparedStatement
将插入分组到合理大小的事务中,并使用多值 insert
。
但就我个人而言,我会 use PgJDBC's support for the COPY
protocol更直接地进行插入。打开 Hibernate Session
对象以获取底层 java.sql.Connection
,get the PGconnection
interface for it , getCopyAPI()
获取CopyManager
,并使用copyIn
将您的数据输入数据库。
由于看起来您的数据不是 CSV 格式而是固定宽度的字段格式,您需要做的是启动一个线程从文件中读取数据,将每个数据转换为适用于 PostgreSQL 的 CSV 格式输入,并将其写入缓冲区,copyIn
可以使用传递的 Reader
进行消费。这听起来比实际更复杂,并且有很多使用 java.io.Reader
和 java.io.Writer
接口(interface)的 Java 生产者/消费者线程实现的例子.
您可以改为为 Reader
编写一个过滤器,它包装底层文件阅读器并转换每一行。这比生产者/消费者线程要简单得多。首先将其作为首选进行研究。
关于java - 如何优化从平面文件到 BD PostgreSQL 的数据导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23660415/
我有一个具有以下结构的 SQL 表,例如 name father ----------------- alex kmal jury salama 我尝试过这段代码...但它不起作用 c
如何创建一个方法来播放数组中的所有数据,并创建一个 while 或 for 来包含 BD 上该数组中的所有记录。由于每个记录由数据库表中的两列组成。我有 1000 条记录。如何插入这个数组来播放 BD
这个问题已经有答案了: MySQL unknown column in ON clause (4 个回答) 已关闭 3 年前。 我正在尝试在 Sakila 数据库中开发 SQL (MySQL) 功能。
我有以下关系, 想知道如何让团队赢得比赛? 最佳答案 SELECT m.id_match, IF((id_home_team = ? AND score_home_team > score_a
我目前正在使用 PHP 和 MYSQL 为我所有的沙龙服务构建一个接口(interface),一切都很好,直到我不得不添加我的打蜡服务: 在谈论打蜡时,您可以拥有这些组之间的所有组合: Lips
每次,当我从 API 请求获取数据时,我都需要比较和更新记录(如果有任何更改)。 例如我已经保存了用户 user = User.first user.name => 'name_one
每次,当我从 API 请求获取数据时,我都需要比较和更新记录(如果有任何更改)。 例如我已经保存了用户 user = User.first user.name => 'name_one
需要你的帮助。 我需要更新mysql表中的数组数据。我的问题是,有一些数组值没有“照片”颜色(检查数组中的第四个字段),因为我的查询失败并出现错误“列计数与第 1 行的值计数不匹配”下面是我正在尝试的
大家早上好,我有一个问题,你正好需要导入1400万条记录,其中包含一家公司的客户信息。 平面文件。 txt有2.8GB,我开发了一个java程序,逐行读取平面文件,处理信息放入一个对象中,然后插入到P
几天前我遇到了一个无法解决的问题,我尝试连接服务器上的 Postgres bd,我使用 laravel 但是当我连接到我的 Postgres bd 时它突出显示了一个错误,这个出现错误 PDOExce
我在创建一些查询时遇到问题。我正在使用 Sakila DB。我正在尝试创建一个新列,其中包含每个客户的延迟次数,使用“count ((datediff (rental.rental_date,rent
我想在一个BD中添加一个数组数据 我有这个代码 $id=$usuario->id; $datereg = date ( "Y-m-d H:i:s" ); $dateact = date ( "Y-m-
我这里有一个简单的项目,有两个模型,两个模型都包含一个名为 telefone 的属性。 telefone 是葡萄牙语中的电话。 代码 class Medico (models.Model):
我正在尝试在 MYSQL 中为我的数据库建模,我希望我的结构由一个数据收集表组成,该表将自动生成 cygnus,然后是与温室和用户相关的那些数据的后续表。 将每个用户的所有传感器的所有数据放在一个表中
我的数据库中有一些数据是用这种方式存储的 -> Sánchez 代表 Sánchez。当我在输入字段中按姓氏搜索时,如果我键入“Sánc”或“Sánch”,我会正确地找到用户,但如果我搜索“Sanch
我是vim的初学者,我有一个简单的问题。 当我们有很多缓冲区时,:q 和:bd 命令有什么区别? 谢谢您的回答。 最佳答案 :q退出当前窗口。 只有一个窗口:退出vim。 (如果有更多窗口打开(拆分)
我刚接触 PHP 世界,最近遇到了一些问题。我给你解释一下: 我有一个包含多个表的数据库。我的一个表格包含有关社交网络(facebook、twitter、youtube、instagram 等)如何使
我当前有一个网站的搜索表单,该表单使用关键字搜索和选择标签向 mysql 数据库发出搜索请求。现在它需要搜索栏类似的所有结果。然后,它使用 if 语句根据结果的信息过滤掉其余结果(如果当前行中没有 r
有时我使用 localStorage 将登录后的信息存储为“idclient”、“name”,然后在系统的其他 View 中使用这些数据,用户在其中与系统交互。没有localStorage,用PHP,
找到解决方案,见下文* 我试图通过 SimpleJdbcCall (使用 java + jpa)执行存储的函数,但我无法执行,它显示: [Request processing failed; nest
我是一名优秀的程序员,十分优秀!