如何通过R在Postgre数据库中传输大的TSV文件

时间:2019-09-30 15:51:08

标签: r postgresql csv

我在给定的服务器上有一个20 Go的大TSV文件。我需要将数据装入位于另一台服务器的PostGreSQL数据库中。

通常,我在TSV文件所在的第一台服务器上使用R接口将文件传输到PostGreSQL数据库。

  • 我试图通过PostGre界面直接为tsv文件收费,但它不能与tsv文件一起使用(仅适用于csv);
  • 我曾尝试从服务器打开R中的文件,但已发出虚拟内存。

这是我在R中使用的:

##############################################################################
# Database connection
##############################################################################

# define driver
drv <- dbDriver("PostgreSQL")

# set up connection to existing PostgreSQL database, just plug in own details

con <- dbConnect(drv,
             dbname = "mydatabase",
             host = "(my server adress)",
             port = "5432",
             user = "XXX", password = "XXX")
 ##############################################################################
# File loading
 ##############################################################################

 data2<-as.data.frame(fread("/myfile"))
 dbWriteTable(con, "My_data",data2,append = TRUE, row.names = FALSE)

这是我收到的错误消息:

  Opened 20.19GB (21680897784 bytes) file ok but could not memory map it. This is a 64bit process. There is probably not enough contiguous virtual memory available.

2 个答案:

答案 0 :(得分:0)

我不认为R支持非内存驻留数据帧(无论如何都是标准的)。因此,如果数据不适合R的内存,则不能使用R的“ dbWriteTable”。

看起来好像不是在进行统计转换或在R中执行任何类似的操作,因此您也许应该只使用psql的\ copy。然后,您将错过fread对定界符和类型的推断,因此可能需要花些时间才能使其完全相同。

psql -c '\copy "My_data" from /myfile'

此外,如果dbWriteTable尚不存在,则看起来它会创建该表,而\ copy不会创建该表,因此将需要更多摆弄。

  

我试图通过PostGre界面直接为tsv文件充电,但是它不能与tsv文件一起使用(仅适用于csv);

您没有给我们看任何能帮助我们解决这个问题的东西。你尝试了什么?您遇到什么错误?您的文件是否需要转义,如果需要,该如何处理?使用COPY或\ copy,可以使用文本格式(使用反斜杠转义需要转义的内容),也可以使用CSV格式,然后将制表符指定为定界符with (format csv, delimiter E'\t'),在这种情况下转义特殊字符通过引用它们而不是反击它们。

答案 1 :(得分:0)

感谢您的更新。我尝试直接使用postGre SQL,但仍然无法正常工作。

COPY "table_name" FROM 'C:\Users\XXX\Desktop\"filename".tsv' DELIMITER '\t'

我以前创建了表格。

我遇到以下错误:

ERROR:  ERREUR:  le délimiteur COPY doit être sur un seul caractère sur un octet

SQL state: 0A000