I have a moderate-sized file (4GB CSV) on a computer that doesn’t have sufficient RAM to read it in (8GB on 64-bit Windows). In the past I would just have loaded it up on a cluster node and read it in, but my new cluster seems to arbitrarily limit processes to 4GB of RAM (despite the hardware having 16GB per machine), so I need a short-term fix.
Is there a way to read in part of a CSV file into R to fit available memory limitations? That way I could read in a third of the file at a time, subset it down to the rows and columns I need, and then read in the next third?
Thanks to commenters for pointing out that I can potentially read in the whole file using some big memory tricks:
Quickly reading very large tables as dataframes in R
I can think of some other workarounds (e.g. open in a good text editor, lop off 2/3 of the observations, then load in R), but I’d rather avoid them if possible.
So reading it in pieces still seems like the best way to go for now.
You could read it into a database using RSQLite, say, and then use an sql statement to get a portion.
If you need only a single portion then
read.csv.sqlin the sqldf package will read the data into an sqlite database. First, it creates the database for you and the data does not go through R so limitations of R won’t apply (which is primarily RAM in this scenario). Second, after loading the data into the database , sqldf reads the output of a specified sql statement into R and finally destroys the database. Depending on how fast it works with your data you might be able to just repeat the whole process for each portion if you have several.Only one line of code accomplishes all three steps, so it’s a no-brainer to just try it.
See
?read.csv.sqland?sqldfand also the sqldf home page.