cara mengirim objek json yang sangat besar sebagai respons - node.js dengan express

Saya telah mendapatkan kesalahan ini FATAL ERROR: JS Allocation failed - process out of memory dan saya telah menunjukkannya sebagai masalah karena saya mengirim objek json yang sangat besar ke res.json (atau JSON.stringify) Untuk memberi Anda beberapa konteks, pada dasarnya saya mengirim sekitar 30.000 file konfigurasi (setiap file konfigurasi memiliki sekitar 10.000 baris) sebagai satu objek json

Pertanyaan saya adalah, apakah ada cara untuk mengirim objek json sebesar itu atau adakah cara yang lebih baik untuk mengalirkannya (seperti menggunakan socket.io?)

Saya menggunakan: simpul v0.10.33, [email protected]

PEMBARUAN: Contoh kode

var app = express();

app.route('/events')
.get(function(req, res, next) {
  var configdata = [{config:<10,000 lines of config>}, ... 10,000 configs]
  res.json(configdata); // The out of memory error comes here
})

person abarik    schedule 12.05.2015    source sumber
comment
Bisakah Anda memberikan sedikit contoh kode?   -  person Evan Hahn    schedule 13.05.2015
comment
saya telah menambahkan kode contoh kode   -  person abarik    schedule 13.05.2015
comment
Tentunya jawabannya TIDAK mengirim 30.000 file konfigurasi sekaligus? Ini adalah bau kode. Bahkan 1 unduhan json dengan 10.000 baris saja sudah banyak.   -  person BenjaminPaul    schedule 13.05.2015
comment
ya, saya setuju... itu adalah desain kode yang buruk. saya telah memperbaikinya dengan socket.io untuk mengalirkan file konfigurasi daripada mengirim semuanya sekaligus   -  person abarik    schedule 13.05.2015
comment
juga, karena saya menyimpan setiap file konfigurasi sebagai entri db, saya tidak dapat melakukan streaming baris demi baris. ditambah membaca artikel ini, saya melihat 10 ribu baris dalam satu file konfigurasi boleh dibaca sekaligus josh.zeigler.us/technology/web-development/   -  person abarik    schedule 13.05.2015


Jawaban (3)


Setelah banyak mencoba, saya akhirnya memutuskan untuk menggunakan socket.io untuk mengirim setiap file konfigurasi sekaligus daripada semua file konfigurasi sekaligus. Ini memecahkan masalah kehabisan memori yang membuat server saya mogok. Terima kasih atas seluruh bantuan Anda

person abarik    schedule 13.05.2015

Cobalah untuk menggunakan aliran. Yang Anda butuhkan adalah aliran yang dapat dibaca yang menghasilkan data sesuai permintaan. Saya akan menulis kode yang disederhanakan di sini:

var Readable = require('stream').Readable;
var rs = Readable();

rs._read = function () {
    // assuming 10000 lines of config fits in memory
    rs.push({config:<10,000 lines of config>);
};

rs.pipe(res);
person Magomogo    schedule 14.05.2015

Anda dapat mencoba meningkatkan node memori yang tersedia dengan bendera --max_old_space_size pada baris perintah.

Mungkin ada solusi yang lebih elegan. Reaksi pertama saya adalah menyarankan penggunaan res.json() dengan objek Buffer daripada mencoba mengirim seluruh objek sekaligus, tetapi kemudian saya menyadari bahwa apa pun yang dikonversi ke JSON mungkin ingin menggunakan seluruh objek sekaligus. Jadi Anda akan kehabisan memori meskipun Anda beralih ke streaming. Atau setidaknya itulah yang saya harapkan.

person Trott    schedule 12.05.2015
comment
baiklah, saya pasti dapat merangkai satu file konfigurasi pada satu waktu dan itu tidak masalah. masalahnya muncul, ketika saya mencoba merangkai 10.000 file konfigurasi (setiap file konfigurasi memiliki 10.000 suka). Bisakah Anda menunjukkan contoh penggunaan objek buffer. Jika tidak, saya pikir saya akan menggunakan metode streaming socket.io... - person abarik; 13.05.2015