2015-08-17 14 views
9

Próbuję napisać dużego zestawu danych (10 cols, 100M rekordy) z R do Hana SAP za pomocą RJDBC za dbWritetable w następujący sposóbNapisz do Hana SAP z RJDBC użyciu dbWritetable bardzo powolny z powodu rekordu przez rekordu wstawić

library("RJDBC") 
drv <- JDBC("com.sap.db.jdbc.Driver", "/data/hdbclient/ngdbc.jar", "'") 
database <- dbConnect(drv,"jdbc:sap://servername", "USER", "PASS") 

dbWriteTable(database, "largeSet", largeSet) 

To działa, ale jest bardzo powolne (75 tys. Rekordów na HOUR). Przetestowałem także RODBC (sqlsave), co pokazuje ten sam problem.

Patrząc na kod za numerem wydaje się, że zapis jest rejestrowany według rekordu (to jest tego samego, co wstawienie do) i rzeczywiście użycie linii po linii wstawienia do użycia dbSendUpdate wykazuje taką samą wydajność. Sprawdziłem, że problem nie dotyczy samej prędkości połączenia.

ROracle ma opcję bulk_write, która wydaje się rozwiązać ten problem, ale ponieważ próbuję pisać do HANA, potrzebuję RJDBC lub RODBC.

Czy ktoś może mi powiedzieć, w jaki sposób mogę przyspieszyć pisanie do HANA, uruchamiając pismo masowe lub inną metodę?

+0

Opcja 'pakiet RMySQL' używa' LOAD INFILE' dane do masowego wstawiania wierszy w tabeli. Nie wydaje się to możliwe w przypadku 'RJDBC', ale zawsze możesz wyeksportować swoje dane do CSV i załadować je do HANA ręcznie lub napisać funkcję, aby wykonać te wszystkie kroki za Ciebie. – daroczig

+0

@daroczig Tak, więc w zasadzie szukam sposobu, aby RJDBC użył takiego polecenia (być może pisząc wrapper oparty na RMySQL lub Rsqlite). Importowanie CSV/import HANA jest czymś, czego chcę uniknąć, ponieważ jest to niepotrzebny dodatkowy krok, a wydajność będzie problemem (muszę napisać 3 miliardy rekordów). – Michiel

+0

Jestem prawie pewien, że nie będziesz miał szczęścia z '' '' JDBC' do wstawiania dużej ilości danych. Zobacz np. te testy porównawcze: https://github.com/szilard/benchm-R-mysql Sposób na CSV będzie dużo szybszy: robię to z innymi bazami danych - z przyjemnością podzielę się z nami kilkoma szczegółami na temat tego podejścia i skrypt, który może być ponownie użyty w tym celu, jeśli jest zainteresowany. – daroczig

Odpowiedz

0

Jeśli Twoim głównym celem jest przyspieszenie, bez zmiany zbyt dużej ilości innych, możesz przejść do pakietu sjdbc, który jest o wiele bardziej wydajny pod tym względem niż RJDBC (który niestety nie zwrócił dużej uwagi w ostatnim czasie). lat).

Kiedy to piszę i sprawdzam ponownie pod numerem CRAN, wygląda na to, że Simon niedawno odnalazł i opublikował nowe wydanie zaledwie tydzień temu. Ten robi w rzeczywistości obejmują poprawę dbSendUpdate:

https://cran.r-project.org/web/packages/RJDBC/NEWS

Powiązane problemy