Rethinkdb java api исключение outofmemoryerror

у меня есть большой файл документа (~ 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();
    }
}

Разместите код ...

Ludovic Feltz 17.05.2018 10:51

я обновлю ...

Erdem Aydemir 17.05.2018 10:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
159
2

Ответы 2

Я не вижу, где и как читается файл; Я предполагаю, что это ошибка. Вы всегда можете попробовать использовать Eclipse MAT и -XX: + HeapDumpOnOutOfMemoryError, чтобы получить дамп кучи, и просто проверить, что не так.

у меня есть несколько больших файлов. Строка 3gb 2gb 500.000+. Пробовал другие файлы doc. У меня такая же ошибка. Примечание. В той же логике и в том же блоке кода нет проблем при индексации в ElasticSearch. Я думаю, проблема в разъеме rethinkdb.

Erdem Aydemir 17.05.2018 11:24

Возможно, вам нужно снова закрыть соединение после того, как вы его создали. В вашем решении тоже используется пул соединений? Так же как оптимизация производительности ...

Frischling 17.05.2018 11:38

Открываю и закрываю соединение для каждой вставки. Ничего не изменилось.

Erdem Aydemir 17.05.2018 11:53

А вы уже проверяли дамп кучи?

Frischling 23.05.2018 07:49

Я подумал, что это ошибка в моем коде. Думаю, я написал это в структуре, которая постоянно потребляет память. Избавился от ошибки более стабильным кодом.

Erdem Aydemir 23.05.2018 14:56

Попробуйте вставить эти объекты по строкам, на данный момент вы сопоставляете 430 тыс. Строк и храните их в памяти, что может вызвать проблемы при их вставке в БД.

Или увеличьте выделение памяти JVM

Другие вопросы по теме