2012-06-18 11 views
11

Nigdy nie musiałem tego robić wcześniej, więc prawdopodobnie jest to coś naprawdę podstawowego, ale myślałem, że o to zapytam.Jak odczytać bardzo duże (> 1GB) pliki tar.gz w pliku Node.js?

Jaki jest właściwy sposób na odczytanie bardzo dużego pliku w Node.js? Powiedzmy, że plik jest zbyt duży, aby przeczytać wszystkie naraz. Powiedzmy, że plik może być w formacie .zip lub .tar.gz.

Pierwsze pytanie, czy najlepiej jest najpierw rozpakować plik i zapisać go na dysku (używam teraz programu Stuffit na komputerze Mac), a następnie pracować z tym plikiem? Czy możesz odczytać strumień IO prosto ze skompresowanej wersji .zip lub .tar.gz? Myślę, że trzeba wiedzieć, format zawartości w pliku skompresowanym, więc prawdopodobnie masz do dekompresji (tylko dowiedziałem się ten plik .tar.gz jest rzeczywiście plik .dat) ...

Wtedy głównym problemem jest to, jak mogę przeczytać ten duży plik w Node.js? Powiedzmy, że jest to plik XML o pojemności 1 GB, gdzie powinienem zacząć go analizować? (Nie, jak parsować XML, ale jeśli czytasz duży plik wiersz po wierszu, jak parsujesz coś takiego jak XML, który musi znać kontekst poprzednich linii).

Widziałem fs.createReadStream, ale obawiam się, że z nim pomówię ... nie chcę eksplodować mojego komputera. Po prostu szukam wskazówek w dobrym kierunku.

+2

Co chcesz z tym zrobić? –

+0

Załóżmy, że jest to bardzo duży plik CSV i po prostu chcę utworzyć rekord bazy danych dla każdej linii. –

+0

Masz dwie problemy: 1. Czy jest dostępny czytnik plików zip dla Węzła i 2. Czy jest czytnik strumienia XML (który może użyć pierwszego strumienia jako danych wejściowych). Nie wiesz, jakie opcje są dostępne, ale które mogą ci pomóc w wyszukiwaniu ... – Joe

Odpowiedz

9

tam jest wbudowany w zlib modułu dla strumienia dekompresji i sax dla strumienia analizowania XML

var fs = require('fs'); 
var zlib = require('zlib'); 
var sax = require('sax'); 

var saxStream = sax.createStream(); 
// add your xml handlers here 

fs.createReadStream('large.xml.gz').pipe(zlib.createUnzip()).pipe(saxStream); 
+0

W jaki sposób mam zamiar skompresować katalog zawierający dane GB? –

+0

czy chcesz natychmiast przetworzyć ten zip lub po prostu chcesz zapinać i zapisywać? Najprawdopodobniej zaserwowałbym tylko komendę dla programu tar + gz –

+0

Wystarczy, że zapiszę katalog i zapiszę. Jestem małym nowicjuszem w Node.js, nie jestem obeznany z tarłem tarn tar + gz: \ –

1

Możemy również zip coś katalogów takich jak następuje:

var spawn = require('child_process').spawn; 
var pathToArchive = './very_large_folder.tar.gz'; 
var pathToFolder = './very_large_folder'; 

var tar = spawn('tar', ['czf', pathToArchive, pathToFolder]); 
tar.on('exit', function (code) { 
     if (code === 0) { 
       console.log('completed successfully'); 
     } else { 
       console.log('error'); 
     } 
}); 

To działało ładnie :)

Powiązane problemy