2017-10-18 1 views
3

J'ai un gros fichier JSON (8 Go, 8 millions de caisses) mais j'ai seulement besoin d'un petit échantillon. Le stream_in simple ne fonctionne pas parce que le dossier est trop grand.exemple d'un grand fichier json

Pour résoudre le problème, j'ai essayé le code suivant:

books <- list("Books_5.json") 
books <- map(books, ~ stream_in(file(.x)) %>% sample_n(385)) 
books <- as.data.frame(books) 

Le problème est que, après 3 millions de pages R arrête la lecture dans le fichier parce que le fichier est si grand. Une idée comment je peux obtenir un échantillon de 385 cas de ce fichier?

Exemple d'un fichier plus petit. Les variables sont les mêmes.

Variables: 9 
$ reviewerID  <chr> "AF50PEUSO9MSV", "A1L0TVAJ1TYE06", "A64NRL5OSR3KB", ... 
$ asin   <chr> "B0000A1G05", "B009SQQF9C", "B005HRT88G", "B00D5T3QK... 
$ reviewerName <chr> "Matthew J. Hodgkins", "TCG", "Me", "J. Lee", "A. Bu... 
$ helpful  <list> [<1, 1>, <0, 1>, <1, 1>, <0, 0>, <0, 0>, <0, 0>, <0... 
$ reviewText  <chr> "This is the lens that I always keep on my camera by... 
$ overall  <dbl> 5, 5, 5, 5, 5, 5, 5, 4, 5, 2, 5, 4, 5, 4, 5, 5, 3, 4... 
$ summary  <chr> "Great lens!", "I love them! What else can I say", "... 
$ unixReviewTime <int> 1370736000, 1404518400, 1387411200, 1385769600, 1379... 
$ reviewTime  <chr> "06 9, 2013", "07 5, 2014", "12 19, 2013", "11 30, 2... 
+1

Pourriez-vous fournir des exemples de données? –

Répondre

2

Si votre fichier a un cas par ligne, vous pouvez utiliser le package LaF pour le faire de façon très efficace:

library(LaF) 
random_lines <- sample_lines(filename = "Books_5.json", 
    n = 385) 

Vous pourriez alors de transformer les lignes dans votre format requis, mais cette solution permet de lire des fichiers volumineux sans tout lire en mémoire.

Edit: Transformer les lignes résultant en une data.frame:

do.call("rbind",lapply(random_lines, fromJSON)) 

Cela devrait fonctionner aussi longtemps que les champs de la JSON-objet ne contiennent que des valeurs uniques (à savoir ne sont pas imbriqués).

+0

Merci pour votre réponse, mais je ne sais pas comment transformer la chaîne de caractères qui en résulte dans le cadre de données d'origine à nouveau. – Hadsga

+0

Difficile à dire sans savoir à quoi ressemble la chaîne de caractères résultante ... avez-vous essayé 'jsonlite :: fromJSON()'? –

+0

Le fichier se présente comme suit: 'chr [1: 385]" {\ "reviewerID \": \ "A29BC531E6553J \", \ "asin \": \ "0812510011 \", \ "reviewerName \": \ "Richard Rivera \ ", \" utile \ "| __truncated__ ...' – Hadsga