2015-06-30 28 views
35

Ho un processo manuale dove sto caricando file di 5-6 GB a un server web tramite ricciolo:caricare un file sopra 2,15 GB in R

curl -X POST --data-binary @myfile.csv http://myserver::port/path/to/api 

Questo processo funziona bene, ma io' d amore di automatizzare utilizzando R. Il problema è che io o non so quello che sto facendo, o le librerie R per riccio non sanno come gestire i file più grandi di 2 GB ~:

library(RCurl) 
postForm(
    "http://myserver::port/path/to/api", 
     file = fileUpload(
     filename = path.expand("myfile.csv"), 
     contentType = "text/csv" 
    ),.encoding="utf-8") 

Yeilds Error: Internal Server Error

httr non funziona eithe R:

library(httr) 
POST(
     url = "http://myserver:port/path/to/api", 
     body = upload_file(
     path = path.expand("myfile.csv"), 
     type = 'text/csv'), 
     verbose() 
    ) 

che produce:

Response [http://myserver:port/path/to/api] 
    Date: 2015-06-30 11:11 
    Status: 400 
    Content-Type: <unknown> 
<EMPTY BODY> 

HTTR è un po 'più informativo con l'opzione verbose(), dicendomi:

-> POST http://myserver:port/path/to/api 
-> User-Agent: libcurl/7.35.0 r-curl/0.9 httr/1.0.0 
-> Host: http://myserver::port 
-> Accept-Encoding: gzip, deflate 
-> Accept: application/json, text/xml, application/xml, */* 
-> Content-Type: text/csv 
-> Content-Length: -2147483648 
-> Expect: 100-continue 
-> 
<- HTTP/1.1 400 Bad Request 
<- Server: Apache-Coyote/1.1 
<- Transfer-Encoding: chunked 
<- Date: Tue, 30 Jun 2015 11:11:11 GMT 
<- Connection: close 
<- 

Il Content-Length: -2147483648 guarda con sospetto, come un integer overflow 32 bit , quindi penso che questo sia un bug in httr. Sospetto che RCurl stia vivendo un fallimento simile.

Mi piacerebbe davvero un involucro minimale attorno a curl -X POST --data-binary, ma a meno che, quali sono le mie opzioni per il caricamento di file abbastanza grandi da R?

+5

Suppongo che tu stia utilizzando l'ultima versione di ** httr ** che utilizza il pacchetto [curl] (https://github.com/jeroenooms/curl/tree/master/R) R. Se non riesci a farlo funzionare usando il pacchetto di Jeroen direttamente (bypassando httr) potrebbe essere più veloce creare un problema su github. – joran

+0

@joran Sì, sto usando httr, che dipende dall'arricciatura. Ho fatto un problema github, ma nel frattempo sono curioso di sapere se qualcuno carica un file 2.2GB + in un servizio web da R. Non posso essere la prima persona nella storia a provare a farlo ... – Zach

+3

Nel frattempo, è possibile utilizzare 'system' per richiamare direttamente curl. – tonytonov

risposta

14

Questo bug è stato risolto nella versione dev di HTTR/ricciolo:

devtools::install_github("jeroenooms/curl") 
devtools::install_github("hadley/httr") 

Questo è un bug nei httr e curl pacchetti per R. Il bug è stato fixed on GitHub come del 2 luglio 2015, e la modifica verrà presto inoltrata a CRAN.

È anche possibile che stavo chiamando RCurl in modo non corretto nel comando sopra, ma non ho mai potuto capire l'invocazione corretta.

+2

_Se_ hai effettivamente copiato il comando precedente, hai scritto in modo errato ** uft-8 **, è ** utf-8 ** – zerweck

+1

@zerweck Buona cattura! Penso che tu possa usare il pulsante '(modifica)' sotto il mio post per suggerire modifiche, che poi posso esaminare. – Zach