Я предполагаю, что ваши CSV-файлы очень большие, которые вы импортируете в базу данных? Насколько мне известно, R сначала хочет сохранить данные в кадре данных с кодом, который вы написали, сохраняя данные в памяти. Альтернативой будет чтение CSV-файла в блоках, как вы это делаете с Python Pandas.
При вызове ?read.csv
я увидел следующий вывод:
nrows
: максимальное количество строк для чтения. Отрицательные и другие недопустимые значения игнорируются.
skip
: количество строк файла данных, которые нужно пропустить перед началом чтения данных.
Почему бы вам не попытаться прочитать 5000 строк за раз в блок данных, записать в базу данных PostgreSQL и затем сделать это для каждого файла.
Для Например, для каждого файла сделайте следующее:
number_of_lines = 5000 # Number of lines to read at a time
row_skip = 0 # number of lines to skip initially
keep_reading = TRUE # We will change this value to stop the while
while (keep_reading) {
my_data <- read.csv(x, nrow = number_of_lines , skip = row_skip)
dbWriteTable(con, "prices", my_data , append = TRUE, row.names = FALSE) # Write to the DB
row_skip = 1 + row_skip + number_of_lines # The "1 +" is there due to inclusivity avoiding duplicates
# Exit Statement: if the number of rows read is no more the size of the total lines to read per read.csv(...)
if(nrow(my_data) < number_of_lines){
keep_reading = FALSE
} # end-if
} # end-while
Делая это, вы разбиваете CSV на более мелкие части. Вы можете поиграть с переменной number_of_lines
, чтобы уменьшить количество циклов. Это может показаться немного хакерским с вовлечением всех oop, но я уверен, что это будет работать