2016-09-24 11 views
6

Jestem stosunkowo nowy w "dużym przetwarzaniu danych" w r tutaj, mam nadzieję, że poszukam jakiegoś poradnika jak radzić sobie z plikiem csv o pojemności 50 GB. Obecny problem jest następujący:Jak radzić sobie z dużym plikiem csv o pojemności 50 GB w języku r?

Stół wyglądało:

ID,Address,City,States,... (50 more fields of characteristics of a house) 
1,1,1st street,Chicago,IL,... 
# the first 1 is caused by write.csv, they created an index raw in the file 

chciałbym znaleźć wszystkie wiersze, które są należące San Francisco, CA. To powinien być łatwy problem, ale csv jest zbyt duży.

wiem, że mam dwie możliwości robi to w R i inny sposób na wykorzystanie bazy danych, aby go obsługiwać:

(1) Za pomocą pakietów ffdf R to:

od ostatniego razu plik jest zapisywany, to korzystał z write.csv i zawiera wszystkie różne typy.

all <- read.csv.ffdf(
    file="<path of large file>", 
    sep = ",", 
    header=TRUE, 
    VERBOSE=TRUE, 
    first.rows=10000, 
    next.rows=50000, 
) 

konsola daje mi to:

Error in ff(initdata = initdata, length = length, levels = levels, ordered = ordered, 
: vmode 'character' not implemented 

Przeszukiwanie internecie, znalazłem kilka odpowiedzi, które nie pasują do mojej sprawy, a ja naprawdę nie mogę zrozumieć, jak przenieść „charakteru” do typu "czynnik", jak wspomniano.

Potem próbowałem użyć pliku read.table.ffdf, to jeszcze bardziej katastrofa. Nie mogę znaleźć solidnego przewodnika dla tego.

(2) Korzystanie R jest readline:

wiem, że to kolejny dobry sposób, ale nie może znaleźć skuteczny sposób, aby to zrobić.

(3) Za pomocą SQL:

Nie jestem pewien, jak przenieść plik do wersji SQL i jak sobie z tym poradzić, jeśli nie jest dobrym przewodnikiem chciałbym spróbować. Ale ogólnie, chciałbym pozostać przy R.

Dzięki za odpowiedź i pomoc!

+0

Sprawdź, czy [ta odpowiedź] (http://stackoverflow.com/questions/23197243/how-do-i-read-only-lines-that-fulfil-a-ondition-from-a-csv-into- r) pomaga. –

+1

w v. Podobny do ^^ link http://stackoverflow.com/questions/26861951/using-read-csv-sql-to-select-multiple-values- from-a-single-column – user20650

+0

Sprawdź to dzięki! – windsound

Odpowiedz

8

Możesz użyć R z SQLite za zasłonami z pakietem sqldf. Można użyć funkcji read.csv.sql w pakiecie sqldf, a następnie można zapytać o dane, ale chcesz uzyskać mniejszą ramkę danych.

Przykład z docs:

library(sqldf) 

iris2 <- read.csv.sql("iris.csv", 
    sql = "select * from file where Species = 'setosa' ") 

Użyłem tej biblioteki na bardzo dużych plików CSV z dobrymi wynikami.

+1

Dzięki Ill sprawdź to! Obecny problem, który mam również obejmuje dodatkową kolumnę indeksowania w dużym pliku danych, czy read.csv.sql może sobie z tym poradzić? : D – windsound

+1

Obecny problem, który mam również obejmuje dodatkową kolumnę indeksowania w dużym pliku danych, czy istnieje sposób mogę to naprawić? teraz mówi mi, że jeśli z drugiego rzędu ma 1 pole więcej niż pierwszy wiersz .. – windsound

+0

@ windind Nie jestem pewien czy podążam dokładnie, ale wygląda na to, że twój plik CSV może nie mieć rekordów o stałej liczbie lub kolumnach rekord. Musisz eksperymentować z danymi. Możesz usunąć ten wiersz z problemami, ale jeśli Twoje dane CSV nie są cytowane i masz przecinki w danych adresowych lub w innych polach, nadal będziesz mieć problemy i będziesz potrzebować regenerować swoje dane, W polach cytowanych. Nadzieja, która pomaga. W funkcji read.csv.sql znajduje się parametr quote, który można ustawić na T/F - w zależności od danych. Powodzenia! –

3

To za długo na komentarz.

R - w podstawowej konfiguracji - ładuje dane do pamięci. Pamięć jest tania. 50 Gbytów nadal nie jest typową konfiguracją (i potrzebujesz więcej, aby załadować dane i zapisać je). Jeśli jesteś naprawdę dobry w R, możesz być w stanie znaleźć inny mechanizm. Jeśli masz dostęp do klastra, możesz użyć równoległej wersji R lub Spark.

Można również załadować dane do bazy danych. Do tego zadania bardzo dobrze pasuje baza danych. R łatwo łączy się z prawie każdą bazą danych. I może się okazać, że baza danych jest bardzo przydatna do tego, co chcesz zrobić.

Lub, możesz po prostu przetworzyć plik tekstowy in situ. Narzędzia wiersza polecenia, takie jak awk, grep i perl, są bardzo odpowiednie do tego zadania. Poleciłbym to podejście za jednorazowy wysiłek. Poleciłbym bazę danych, jeśli chcesz zachować dane do celów analitycznych.

+1

Po drugie proponuję użyć awk lub grep! W przypadku pojedynczych zapytań, takich jak ten, będziesz gotowy w ciągu kilku minut. – vincentmajor

+1

@GordonLinoff, twoja sugestia R i Spark też jest dobra. Użyłem tego na AWS, żeby przebić ~ 4 TB plików binarnych i obsłużyło go z powodzeniem! –

+0

Mam go teraz, po prostu zajmuje trochę czasu, aby uświadomić sobie, że jest to typ bazy danych, ponieważ wcześniej, R radzi sobie dobrze z tabelami danych o pojemności 10 GB ... I bardzo dziękuję za komentowanie! – windsound

Powiązane problemy