web-dev-qa-db-fra.com

write.csv pour les grandes données.table

J'ai un data.table ce n'est pas très gros (2 Go) mais pour une raison quelconque write.csv prend beaucoup de temps pour l'écrire (je n'ai jamais fini d'attendre) et semble utiliser une tonne de RAM pour le faire).

J'ai essayé de convertir le data.table à un data.frame même si cela ne devrait vraiment rien faire puisque data.table étend data.frame. quelqu'un a-t-il rencontré cela?

Plus important encore, si vous l'arrêtez avec Ctrl-C, R ne semble pas rendre de mémoire.

49
Alex

MISE À JOUR 2019.01.07 :

fwrite est sur CRAN depuis le 2016-11-25.

install.packages("data.table")

MISE À JOUR 08.04.2016 :

fwrite a été récemment ajouté à la version de développement du package data.table. Il fonctionne également en parallèle (implicitement).

# Install development version of data.table
install.packages("data.table", 
                  repos = "https://Rdatatable.github.io/data.table", type = "source")

# Load package
library(data.table)

# Load data        
data(USArrests)

# Write CSV
fwrite(USArrests, "USArrests_fwrite.csv")

Selon les tests de référence détaillés indiqués sous accélération des performances de write.table , fwrite est ~ 17x plus rapide que write.csv là (YMMV).


MISE À JOUR 15.12.2015 :

À l'avenir, il pourrait y avoir une fonction fwrite dans le data.table package, voir: https://github.com/Rdatatable/data.table/issues/58 . Dans ce fil, un Gist est lié, qui fournit un prototype pour une telle fonction accélérant le processus d'un facteur 2 (selon l'auteur, https://Gist.github.com/oseiskar/15c4a3fd9b6ec5856c89 =).

RÉPONSE ORIGINALE :

J'ai eu les mêmes problèmes (en essayant d'écrire des fichiers CSV encore plus gros) et j'ai finalement décidé de ne pas utiliser de fichiers CSV.

Je vous recommande d'utiliser SQLite car il est beaucoup plus rapide que de traiter des fichiers CSV:

require("RSQLite")
# Set up database    
drv <- dbDriver("SQLite")
con <- dbConnect(drv, dbname = "test.db")
# Load example data
data(USArrests)
# Write data "USArrests" in table "USArrests" in database "test.db"    
dbWriteTable(con, "arrests", USArrests)

# Test if the data was correctly stored in the database, i.e. 
# run an exemplary query on the newly created database 
dbGetQuery(con, "SELECT * FROM arrests WHERE Murder > 10")       
# row_names Murder Assault UrbanPop Rape
# 1         Alabama   13.2     236       58 21.2
# 2         Florida   15.4     335       80 31.9
# 3         Georgia   17.4     211       60 25.8
# 4        Illinois   10.4     249       83 24.0
# 5       Louisiana   15.4     249       66 22.2
# 6        Maryland   11.3     300       67 27.8
# 7        Michigan   12.1     255       74 35.1
# 8     Mississippi   16.1     259       44 17.1
# 9          Nevada   12.2     252       81 46.0
# 10     New Mexico   11.4     285       70 32.1
# 11       New York   11.1     254       86 26.1
# 12 North Carolina   13.0     337       45 16.1
# 13 South Carolina   14.4     279       48 22.5
# 14      Tennessee   13.2     188       59 26.9
# 15          Texas   12.7     201       80 25.5

# Close the connection to the database
dbDisconnect(con)

Pour plus d'informations, voir http://cran.r-project.org/web/packages/RSQLite/RSQLite.pdf

Vous pouvez également utiliser un logiciel comme http://sqliteadmin.orbmu2k.de/ pour accéder à la base de données et exporter la base de données vers CSV, etc.

-

58
majom