我在给定的服务器上有一个20 Go的大TSV文件。我需要将数据装入位于另一台服务器的PostGreSQL数据库中。
通常,我在TSV文件所在的第一台服务器上使用R接口将文件传输到PostGreSQL数据库。
这是我在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.
答案 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