Once the CSV is loaded via read.csv
, it's fairly trivial to use multicore
, segue
etc to play around with the data in the CSV. Reading it in, however, is quite the time sink.
Realise it's better to use mySQL etc etc.
Assume the use of an AWS 8xl cluster compute instance running R2.13
Specs as follows:
Cluster Compute Eight Extra Large specifications:
88 EC2 Compute Units (Eight-core 2 x Intel Xeon)
60.5 GB of memory
3370 GB of instance storage
64-bit platform
I/O Performance: Very High (10 Gigabit Ethernet)
Any thoughts / ideas much appreciated.
What you could do is use
scan
. Two of its input arguments could prove to be interesting:n
andskip
. You just open two or more connections to the file and useskip
andn
to select the part you want to read from the file. There are some caveats:But you could give it a try and see if it gives a boost to your speed.
Going parallel might not be needed if you use
fread
indata.table
.A comment to this question illustrates its power. Also here's an example from my own experience:
I was able to read in 1.04 million rows in under 10s!
Flash or conventional HD storage? If the latter, then if you don't know where the file is on the drives, and how it's split, it's very hard to speed things up because multiple simultaneous reads will not be faster than one streamed read. It's because of the disk, not the CPU. There's no way to parallelize this without starting at the storage level of the file.
If it's flash storage then a solution like Paul Hiemstra's might help since good flash storage can have excellent random read performance, close to sequential. Try it... but if it's not helping you know why.
Also... a fast storage interface doesn't necessary mean the drives can saturate it. Have you run performance testing on the drives to see how fast they really are?