у меня есть большой файл документа (~ 1,5 ГБ ~ 430 000 строк). Программа считывает файл документа построчно и вставляет каждую строку в rethinkdb. Но я получаю эту ошибку между 11000-12000 строками. В чем причина?
java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) ~[na:1.8.0_171] at java.lang.Thread.start(Thread.java:717) ~[na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:957) ~[na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1367) ~[na:1.8.0_171] at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112) ~[na:1.8.0_171] at java.util.concurrent.Executors$DelegatedExecutorService.submit(Executors.java:678) ~[na:1.8.0_171] at com.rethinkdb.net.Connection.connect(Connection.java:105) ~[rethinkdb-driver-2.3.3.jar:na] at com.rethinkdb.net.Connection.reconnect(Connection.java:94) ~[rethinkdb-driver-2.3.3.jar:na] at com.rethinkdb.net.Connection.reconnect(Connection.java:83) ~[rethinkdb-driver-2.3.3.jar:na] at com.rethinkdb.net.Connection$Builder.connect(Connection.java:422) ~[rethinkdb-driver-2.3.3.jar:na] at com.erdem.rethinkdb.inserter.config.RethinkDBConnectionFactory.createConnection(RethinkDBConnectionFactory.java:17) ~[classes/:na] at com.erdem.rethinkdb.inserter.service.InserterService.insertData(InserterService.java:33) ~[classes/:na] at com.erdem.rethinkdb.inserter.service.InserterService.insertData(InserterService.java:38) ~[classes/:na] at com.erdem.rethinkdb.inserter.InserterApplication.batchInsert(InserterApplication.java:168) [classes/:na] at com.erdem.rethinkdb.inserter.InserterApplication.fileModeIndex(InserterApplication.java:97) [classes/:na] at com.erdem.rethinkdb.inserter.InserterApplication.run(InserterApplication.java:57) [classes/:na] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:788) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:778) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE] at com.erdem.rethinkdb.inserter.InserterApplication.main(InserterApplication.java:37) [classes/:na]
RethinkDBConnectionFactory.java
public class RethinkDBConnectionFactory {
private final RethinkDB r = RethinkDB.r;
private String host;
public RethinkDBConnectionFactory(String host) {
this.host = host;
}
public Connection createConnection() {
return r.connection().hostname(host).connect();
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
}
InserterService
@Service
public class InserterService {
protected final Logger log = LoggerFactory.getLogger(InserterService.class);
private final RethinkDB r = RethinkDB.r;
@Autowired
private RethinkDBConnectionFactory connectionFactory;
private ObjectMapper oMapper = new ObjectMapper();
@SuppressWarnings("unchecked")
public void insertData(Activity activity) {
oMapper.setSerializationInclusion(Include.NON_NULL);
Map<Object, Object> map = oMapper.convertValue(activity, Map.class);
r.db("test").table("twitter").insert(map).run(connectionFactory.createConnection());
}
}
ПереосмыслитьDBConfiguration
@Configuration
@ComponentScan(basePackages = { "com.erdem.rethinkdb.inserter.*" })
@PropertySource("classpath:application.yml")
public class RethinkDBConfiguration {
@Value("${rethinkdb.host}")
private String DBHOST;
@Bean
public RethinkDBConnectionFactory connectionFactory() {
return new RethinkDBConnectionFactory(DBHOST);
}
@Bean
public DbInitializer dbInitializer() {
return new DbInitializer();
}
}
я обновлю ...




Я не вижу, где и как читается файл; Я предполагаю, что это ошибка. Вы всегда можете попробовать использовать Eclipse MAT и -XX: + HeapDumpOnOutOfMemoryError, чтобы получить дамп кучи, и просто проверить, что не так.
у меня есть несколько больших файлов. Строка 3gb 2gb 500.000+. Пробовал другие файлы doc. У меня такая же ошибка. Примечание. В той же логике и в том же блоке кода нет проблем при индексации в ElasticSearch. Я думаю, проблема в разъеме rethinkdb.
Возможно, вам нужно снова закрыть соединение после того, как вы его создали. В вашем решении тоже используется пул соединений? Так же как оптимизация производительности ...
Открываю и закрываю соединение для каждой вставки. Ничего не изменилось.
А вы уже проверяли дамп кучи?
Я подумал, что это ошибка в моем коде. Думаю, я написал это в структуре, которая постоянно потребляет память. Избавился от ошибки более стабильным кодом.
Попробуйте вставить эти объекты по строкам, на данный момент вы сопоставляете 430 тыс. Строк и храните их в памяти, что может вызвать проблемы при их вставке в БД.
Или увеличьте выделение памяти JVM
Разместите код ...