2012-06-18 26 views
11

Tôi chưa bao giờ phải làm điều này trước đây vì vậy đây có thể là một cái gì đó thực sự cơ bản, nhưng tôi nghĩ rằng tôi sẽ hỏi anyways.Làm thế nào để đọc các tệp tar.gz rất lớn (> 1GB) trong Node.js?

Cách thích hợp để đọc tệp rất lớn trong Node.js là gì? Giả sử tệp quá lớn để đọc tất cả cùng một lúc. Ngoài ra, hãy cho biết tệp có thể ở định dạng .zip hoặc .tar.gz.

Câu hỏi đầu tiên, tốt nhất là giải nén tệp trước và lưu tệp vào đĩa (Tôi đang sử dụng Stuffit trên Mac để thực hiện việc này ngay bây giờ), sau đó làm việc với tệp đó? Hoặc bạn có thể đọc luồng IO trực tiếp từ phiên bản .zip hoặc .tar.gz được nén không? Tôi đoán bạn cần biết định dạng của nội dung trong tệp nén, vì vậy bạn có thể phải giải nén (chỉ cần tìm ra tệp này .tar.gz thực sự là tệp .dat) ...

Sau đó, vấn đề chính là, làm cách nào để đọc tệp lớn này trong Node.js? Giả sử đó là tệp XML 1GB, tôi nên xem xét ở đâu để bắt đầu phân tích cú pháp đó? (Không, làm thế nào để phân tích cú pháp XML, nhưng nếu bạn đang đọc tập tin lớn theo từng dòng, làm thế nào để bạn phân tích cú pháp một cái gì đó như XML cần biết bối cảnh của các dòng trước đó).

Tôi đã xem fs.createReadStream, nhưng tôi e ngại gây rối với nó ... không muốn phát nổ máy tính của tôi. Chỉ cần tìm một số con trỏ đi đúng hướng.

+2

Bạn muốn làm gì với ứng dụng này? –

+0

Làm thế nào về, giả sử nó là một CSV rất lớn và tôi chỉ muốn tạo một bản ghi cơ sở dữ liệu cho mỗi dòng. –

+0

Bạn có hai vấn đề, 1. Có đầu đọc tệp zip trực tuyến cho Nút và 2. Có trình đọc XML trực tuyến không (có thể sử dụng luồng đầu tiên làm đầu vào). Bạn không chắc chắn các tùy chọn nào có ở đó nhưng điều đó có thể giúp bạn tìm kiếm ... – Joe

Trả lời

9

có được xây dựng-in zlib mô-đun cho dòng giải nén và sax cho dòng XML phân tích

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

Tôi nên làm thế nào nếu tôi muốn nén một thư mục có chứa GB dữ liệu? –

+0

bạn có cần xử lý zip ngay lập tức hoặc chỉ muốn nén và lưu không? Tôi có lẽ chỉ cần sinh ra tar + gz lệnh con –

+0

Tôi chỉ cần zip thư mục và lưu nó. Tôi không quen với Node.js, tôi không thực sự quen thuộc với việc tạo ra tar + gz: \ –

1

Chúng tôi cũng có thể nén một cái gì đó thư mục như sau:

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'); 
     } 
}); 

này làm việc độc đáo :)

Các vấn đề liên quan