- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我读取文件并从中创建一个对象并存储到 postgresql 数据库。我的文件有 100,000 个文档,我从一个文件中读取并拆分它,最后存储到数据库中。我无法创建 List<>
并将所有文档存储在 List<>
中因为我的内存很小。我读取和写入数据库的代码如下。但 My JVM Heap 已满而无法继续存储更多文件。如何高效地读取文件并存储到数据库。
public void readFile() {
StringBuilder wholeDocument = new StringBuilder();
try {
bufferedReader = new BufferedReader(new FileReader(files));
String line;
int count = 0;
while ((line = bufferedReader.readLine()) != null) {
if (line.contains("<page>")) {
wholeDocument.append(line);
while ((line = bufferedReader.readLine()) != null) {
wholeDocument = wholeDocument.append("\n" + line);
if (line.contains("</page>")) {
System.out.println(count++);
addBodyToDatabase(wholeDocument.toString());
wholeDocument.setLength(0);
break;
}
}
}
}
wikiParser.commit();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void addBodyToDatabase(String wholeContent) {
Page page = new Page(new Timestamp(System.currentTimeMillis()),
wholeContent);
database.addPageToDatabase(page);
}
public static int counter = 1;
public void addPageToDatabase(Page page) {
session.save(page);
if (counter % 3000 == 0) {
commit();
}
counter++;
}
最佳答案
首先你应该申请一个fork-join方法在这里。
主任务解析文件并将最多 100 个项目的批处理发送到 ExecutorService . ExecutorService
的工作线程数应等于可用数据库连接数。如果您有 4 个 CPU 内核,假设数据库可以处理 8 个并发连接而无需进行太多上下文切换。
然后您应该配置一个连接池 DataSource
并使 minSize 等于 maxSize 并且等于 8。尝试使用 HikariCP 或 ViburDBCP 进行连接池。
然后需要配置JDBC批处理。如果您使用的是 MySQL,IDENTITY 生成器将禁用沐浴。如果您使用的是支持序列的数据库,请确保您还使用了增强的标识符生成器(它们是 Hibernate 5.x 中的默认选项)。
通过这种方式,实体插入过程是并行化的,并且与主解析线程分离。主线程应等待 ExecutorService
在关闭之前完成所有任务的处理。
关于java - 如何使用 Hibernate 尽可能快地插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738708/
我知道在 KDB 中,如果您有一个列表,例如... l:`apples`oranges`pears` 您可以像下面这样进行 N 次随机选择: 9?l 但是如何尽可能均匀地选择列表中的每个项目? 最佳答
我真的厌倦了它。我有一个高级 Web 应用程序依赖于大量 Javascript 库(jQuery、jQueryUI、OpenLayers、highcharts、EJSChart 等等)。不用说,Int
我是一名优秀的程序员,十分优秀!