Monday 28 August 2017

โหนด readfile ไบนารี ตัวเลือก


โหนด Js และข้อมูลไบนารี UPDATE: ไม่จำเป็นต้องใช้ข้อมูลนี้เนื่องจาก FileReadStream ในโหนดล่าสุดจะใช้บัฟเฟอร์ตามค่าดีฟอลต์ อย่างไรก็ตามดูเหมือนว่าทั้ง I'm ทำอะไรผิดพลาดหรือเอกสารล้าสมัยเนื่องจากไม่ได้ทำงานแบบนี้บนโหนด HEAD สองส่วนที่ขาดหายไปคือการจัดการข้อมูลไบนารีและสตริงที่มีขนาดใหญ่ Node. js ในโพสต์นี้ฉันต้องการไปมากกว่าเทคนิคบางอย่างสำหรับการจัดการกับข้อมูลไบนารีในโหนดซึ่งส่วนใหญ่จะเกี่ยวข้องกับการเก็บขยะของ V8 และความจริงที่ว่าสตริงในโหนดไม่ได้สร้างขึ้นสำหรับข้อมูลไบนารีพวกเขาสร้างขึ้นเพื่อใช้ UTF-8 และ ข้อมูล UTF-16 มีรายละเอียดเกี่ยวกับเลือดสามข้อที่ทำให้การทำงานกับข้อมูลใน Node. js มีอาการปวด: Large Strings (gt 64K) ไม่ใช่เพื่อนของคุณ ข้อมูลไบนารี (และ ASCII) ในสตริงโหนดจะถูกเก็บเป็นไบต์แรกของสตริง UTF-16 ข้อมูลไบนารีสามารถเก็บได้อย่างมีประสิทธิภาพที่สุดใน Node. js เป็นบัฟเฟอร์ช่วยให้สามารถดูรายการแรกสตริงใหญ่ ๆ เพื่อนของคุณได้ ผู้สร้าง Node. js ตัวเองได้รับมือกับปัญหานี้ด้วยการเปรียบเทียบประสิทธิภาพที่เขาทำกับ nginx ถ้าคุณดูไฟล์ PDF (หรือดูที่กราฟด้านล่างนี้) คุณจะเห็นว่าโหนดทำงานได้ดีพร้อมกับ nginx จนกระทั่งเครื่องหมาย 64 byte แสดงผลแล้วประสิทธิภาพก็ลดลง เหตุผลในคำของ ry: V8 มีตัวเก็บขยะ generational ที่ย้ายวัตถุรอบแบบสุ่ม โหนดไม่ได้รับตัวชี้ไปยังข้อมูลสตริงดิบเพื่อเขียนลงในซ็อกเก็ต คุณสามารถดูสิ่งนี้ได้ในกราฟที่เกี่ยวข้องในภาพนิ่งของ ryan (ฉันหวังว่าคุณจะไม่คิดถึงไรอัน) สิ่งที่ไม่เป็นที่ประจักษ์แก่ฉันทันทีหลังจากอ่านนี่คือสิ่งที่หมายถึงในกรณีที่มีการใช้โหนดเพื่อส่งผ่านข้อมูลขนาดใหญ่ของข้อมูลไบนารีที่เข้ามาเป็นสตริง ถ้าคุณใช้โหนดที่จะพูดอ่านจากระบบแฟ้มที่คุณได้รับสตริงไบนารีไม่ใช่บัฟเฟอร์ คำถามของฉันคือ: ถ้าฉันมีข้อมูลไบนารีติดอยู่แล้วในสตริง UTF-16 หมัด แต่แล้วติดไว้ในบัฟเฟอร์ก่อนที่จะส่งออกจะช่วยด้วย speed. quot คำตอบเพิ่ม throughput จาก 100 MiBSec ถึง 160 MiBSec ตรวจสอบกราฟด้านล่างจากการทดสอบประสิทธิภาพของฉันเองซึ่งฉันเล่นกับขนาด readChunk อื่น ๆ (จำนวนข้อมูลที่ FileReadStream อ่านพร้อมกันและขนาดบัฟเฟอร์ (เท่าไหร่ข้อมูลที่เราเก็บไว้ในบัฟเฟอร์ก่อนล้างข้อมูลด้วยซ็อกเก็ต): อย่างที่คุณเห็น ประสิทธิภาพการใช้บัฟเฟอร์ (Buf) เต้นกางเกงออกเขียนโดยใช้สตริง (Str) ความแตกต่างระหว่างสองชิ้นส่วนของรหัสสามารถมองเห็นด้านล่างผมไม่คิดว่าการแปลงครั้งนี้จะช่วยให้ทุกฉันคิดว่าเมื่อมีอยู่แล้วใน สตริง (เป็นข้อมูลจาก FileReadStream คือ) หนึ่งอาจดีล้างลงในซ็อกเก็ตและดำเนินการต่อ. นี้ทำให้ฉันสงสัยว่าปพลิเคชันอื่น ๆ นอกจากนี้ยังจะดีที่สุดออกสะสมผลลัพธ์ของพวกเขา (บางทีแม้แต่ UTF-8 ของพวกเขาเอาท์พุท) ใน บัฟเฟอร์ที่เป็นไปได้แล้วในที่สุดล้างบัฟเฟอร์แทนที่จะทำซ้ำโทร res. write คนต้องการทดสอบนี้นอกจากนี้ทำให้ฉันสงสัยว่าการปรับปรุงต่อไปกรณีทดสอบของฉันเองอาจจะดีขึ้นถ้าโหนด FileReadStream วัตถุมีการแก้ไข ไปยัง ให้บัฟเฟอร์มากกว่าสตริง Additionaly คุณอาจจะถามเกี่ยวกับการใช้ bufferSize ขนาดใหญ่กว่าขนาด readChunk ซึ่งฉันได้ทดสอบจริง แต่พบว่ามีไม่มากของความแตกต่างเมื่อใช้บัฟเฟอร์ขนาดใหญ่ดังนั้นกลยุทธ์ที่ดีที่สุดจริงๆดูเหมือนจะอ่าน 64KiB ก้อนเข้า บัฟเฟอร์ 64KiB คุณสามารถดูข้อมูลนี้ได้ที่ด้านล่างของโพสต์ ในข้อมูลที่ฉันวาดข้างบนฉันทำจำนวนของการทำงานกับ ab-100-n 1000 กับ 1 ไฟล์ MiB เปลี่ยน chunkSize และ readSize โค้ดตัวอย่างที่เกี่ยวข้องสามารถดูได้ด้านล่าง โค้ดตัวอย่างเต็มรูปแบบจะเป็นส้อมของฉันของโหนด paperboy. Reading ข้อความและข้อมูลไบนารีที่มีลำธารอ่านได้ Node. js บทแนะนำนี้จะอธิบายการใช้และการสร้างสตรีมที่สามารถอ่านได้ของ node. js: ข้อมูลเวอร์ชันผู้เขียน: Jeff Barczewski เผยแพร่: August 3rd, 2013 ข้อความ: nodejs สตรีมระดับ: ระดับกลางข้อกำหนดเบื้องต้น: การเข้ารหัสลับเหตุการณ์การติดตั้งโมดูล npm Node. js v0.10 (เวอร์ชันล่าสุดคือ v0.10.15 ขณะเขียน) แต่สตรีมได้รับส่วนหนึ่งของ Node. js จาก วันเริ่มต้น Streams2 สามารถใช้กับโหนดเวอร์ชันที่เก่ากว่าได้โดยการใช้โมดูล submodable stream ของเอ็นพีเอ็มการบริโภคหรือการใช้สตรีมที่สามารถอ่านได้ตัวอย่างง่ายๆในการอ่านไฟล์และสะท้อนไปยัง stdout: การสร้างไฟล์ย่อย sha1 และส่งผลให้เกิด stdout (คล้ายกัน ไปที่ shasum): เหตุการณ์ข้อมูลถูกเรียกใช้งานบนสตรีมที่สามารถอ่านได้สำหรับแต่ละก้อนข้อมูลดังนั้นคุณจึงควรอัปเดตข้อมูลย่อยสำหรับแต่ละก้อนขณะที่คุณไปจากนั้นในที่สุดเหตุการณ์สิ้นสุดจะถูกไล่ออกเมื่อสตรีมได้สิ้นสุดลงเพื่อให้คุณสามารถส่งข้อมูลสุดท้ายได้ ผล. โปรดทราบว่าทุกครั้งที่คุณโทร. on () เพื่อลงทะเบียนฟังจะส่งกลับสตรีมต้นฉบับเพื่อให้คุณสามารถใช้วิธีห่วงโซ่ได้อย่างง่ายดาย ด้วย Node. js 0.10 มีวิธีที่ดีกว่าในการใช้สตรีม อินเทอร์เฟซที่อ่านง่ายช่วยให้ทำงานได้ง่ายขึ้นโดยใช้สตรีมโดยเฉพาะอย่างยิ่งที่คุณต้องการทำสิ่งอื่นระหว่างการสร้างสตรีมและใช้สตรีม สตรีมที่อ่านได้ใหม่นี้คือสตรีมดึงซึ่งคุณต้องการข้อมูลเมื่อคุณอ่านข้อมูลแทนที่จะดึงข้อมูลมาให้คุณ กุญแจสำคัญในการทำความเข้าใจกับตัวอย่างนี้ก็คือเมื่อใช้อินเทอร์เฟซแบบอ่านข้อมูลใหม่ของสตรีม 2 เหตุการณ์ที่สามารถอ่านได้จะถูกส่งออกทันทีที่สามารถอ่านข้อมูลได้และคุณสามารถเรียกใช้อ่าน () อ่านส่วนต่างๆได้ เมื่อไม่มีข้อมูลเพิ่มเติมอีกแล้ว read () ส่งกลับค่า null แต่แล้วเหตุการณ์ที่อ่านได้อื่นจะถูกยิงอีกครั้งเมื่อมีข้อมูลพร้อมใช้งานอีกครั้ง การดำเนินการนี้จะดำเนินต่อไปจนถึงสิ้นสุดไฟล์เมื่อสิ้นสุดการใช้งานเหมือนก่อน การสร้างสตรีมที่สามารถอ่านได้หากต้องการใช้สตรีมด้วยระบบไฟล์หรือจาก http คุณสามารถใช้หลัก fs และ http เพื่อสร้างสตรีม แต่คุณจะสร้างสตรีมของคุณเองและกรอกข้อมูลด้วยข้อมูลซึ่งอาจเป็นข้อมูลจากฐานข้อมูลหรือ จากแหล่งข้อมูลใด ๆ ต่อไปนี้เป็นตัวอย่างของการสร้างสตรีมที่สามารถอ่านได้ซึ่งสร้างขึ้นจากข้อมูลไบนารีแบบสุ่มแล้วทำแบบแฮชชิ่งก่อนหน้านี้ นี้จะเป็นประโยชน์ในการสร้างกระแสสำหรับการทดสอบ: หมายเหตุ: หลังจากอ่าน () เรียกว่าเราควรอ่านต่อจนกว่าเราจะทำหรือจนกว่า push () จะส่งกลับค่า false การใช้ Streams2 กับ Node. js เวอร์ชันเก่าถ้าคุณต้องการให้รหัสนี้ทำงานร่วมกับ Node. js ที่เก่ากว่า 0.10 คุณสามารถรวมการอ้างอิงสำหรับสตรีมที่อ่านได้ใน package. json ของคุณและเปลี่ยนบรรทัดที่ 5 เพื่ออ่าน: การดำเนินการนี้จะใช้เนทิฟ สตรีมที่อ่านได้ถ้าเวอร์ชัน Node. js เป็น 0.10 ถ้าไม่โหลดระบบจะโหลดโมดูล polyfill readable-stream และใช้งานจากที่นั่น หยุดการทำงานของสตรีมและ Streams2 เนื่องจากสตรีมอาจให้ข้อมูลได้เร็วกว่าที่แอปพลิเคชันสามารถใช้งานได้สตรีมรวมถึงความสามารถในการหยุดชั่วคราวและข้อมูลจะถูกเก็บบัฟเฟอร์ไว้จนกว่าสตรีมจะเริ่มทำงานต่อ ก่อนที่จะสตรีม 2 คุณจะต้องใส่ใจเป็นอย่างยิ่งกับการหยุดชั่วคราวและกลับมาทำงานใหม่รวมถึงการเก็บบัฟเฟอร์ข้อมูลจนกว่าจะเริ่มทำงานใหม่ อย่างไรก็ตามสามารถอ่านได้จากสตรีม 2 (Node. js 0.10 หรือผ่านทางแพ็กเกจแบบอ่านได้) จะใช้งานฟังก์ชันนี้สำหรับคุณและสตรีมจะหยุดชั่วคราวจนกว่าจะมีการเรียกใช้read. read () นอกจากนี้คุณยังสามารถตัดสตรีมเก่าด้วย Readable เพื่อใช้อินเทอร์เฟซใหม่ในสตรีมเก่าได้อีกด้วย: อีกกรณีหนึ่งที่คุณต้องกังวลกับการหยุดชั่วคราวและดำเนินการต่อก็คือถ้ารหัสที่บริโภคของคุณใช้อินเทอร์เฟซแบบ push แบบเก่า ๆ ที่เรียกใช้ (39data39, listener) ซึ่งจะทำให้สตรีมในโหมดที่ใช้ร่วมกันย้อนหลังและคุณจะต้องเรียกใช้. pause () และ. resume () เพื่อควบคุมอัตราข้อมูลที่มาถึงแอ็พพลิเคชันของคุณ ดูเอกสาร API Stream สำหรับรายละเอียดหากคุณใช้อินเทอร์เฟซที่เก่ากว่าในโค้ดของคุณ ลำธารวัตถุเริ่มต้นเมื่อสตรีมได้รับการแนะนำ API อย่างเป็นทางการระบุว่าข้อมูลที่ถูกสตรีมจะเป็นบัฟเฟอร์หรือสตริงอย่างไรก็ตามผู้ใช้หลายคนพบว่ามันเยี่ยมมากที่จะสามารถสตรีมวัตถุได้เช่นกัน Streams2 ใน Node. js 0.10 เพิ่มโหมดอ็อบเจ็กต์เพื่อสตรีมเพื่อให้เป็นระเบียบว่าควรทำงานอย่างไร เมื่ออยู่ในโหมดวัตถุ อ่าน (n) เพียงแค่ส่งกลับวัตถุถัดไป (ละเว้น n) เมื่อต้องการสลับสตรีมไปยังโหมดอ็อบเจ็กต์ให้ตั้งค่า objectMode เป็น true ในตัวเลือกที่ใช้เพื่อสร้างสตรีมที่อ่านได้ของคุณดังนั้นคุณจึงสามารถใช้อ็อบเจ็กต์ในสตรีมได้อย่างง่ายดายเพียงเท่าที่คุณสามารถใช้บัฟเฟอร์และสตริงได้ แต่ข้อ จำกัด เพียงอย่างเดียวก็คือวัตถุที่คุณ pass ไม่สามารถเป็นโมฆะตั้งแต่ที่จะระบุว่าสตรีมได้สิ้นสุดลงแล้ว สตรีมที่อ่านได้ของ Node. js มีความยืดหยุ่นและเรียบง่ายสตรีมที่สามารถอ่านได้ของ Node. js ใช้งานง่ายและง่ายต่อการสร้าง คุณสามารถไม่เพียงสตรีมข้อมูลไบนารีและสตริง แต่ยังมีออบเจ็กต์และยังใช้ประโยชน์จากฟังก์ชันสตรีม ฉันหวังว่าคุณจะสนุกกับการชมสตรีมที่อ่านได้อย่างรวดเร็วนี้โปรดแจ้งให้เราทราบหากคุณมีคำถามใด ๆ สำหรับการอ่านเพิ่มเติมแบ่งปันหน้านี้การจัดเก็บข้อมูลด้วยสตรีมที่สามารถเขียนได้ของ Node. js บทแนะนำนี้จะอธิบายวิธีจัดเก็บข้อมูลด้วยสตรีมที่เขียนได้ของ Node. js และวิธีสร้างสตรีมที่สามารถเขียนได้เอง ข้อมูลเกี่ยวกับเวอร์ชันผู้แต่ง: Jeff Barczewski ที่เผยแพร่: 18 สิงหาคม 2013 Tags: nodejs, streams ระดับ: กลางข้อกำหนดเบื้องต้น: บัฟเฟอร์เหตุการณ์, ติดตั้งโมดูล npm Node. js v0.10 (เวอร์ชันล่าสุดคือ v0.10.16) โดยทั่วไปเป็นส่วนหนึ่งของ Node. js ตั้งแต่ต้น Streams2 คลาสนามธรรมสามารถใช้กับเวอร์ชันเก่า (ก่อน v0.10) ของโหนดโดยใช้โมดูล nmf สามารถอ่านได้ (ทดสอบกับ v1.0.15) จัดเก็บข้อมูลด้วยการเขียนได้ streams การเขียนไฟล์ข้อความตัวอย่างที่ง่ายที่สุดก็คือการเขียนข้อความ utf8 เนื่องจากการเข้ารหัสเริ่มต้นถ้าคุณเขียนสตริงคือ utf8 ถ้าคุณต้องการเขียนสตริงด้วยการเข้ารหัสที่แตกต่างกันจากนั้นคุณสามารถเปลี่ยนบรรทัด createWriteStream หรือเพิ่มการเข้ารหัสลงในการเขียนแต่ละครั้ง การเขียนไบนารีไฟล์การเขียนไบนารีไฟล์เป็นเพียงเรื่องของการใช้บัฟเฟอร์มากกว่าสตริงสำหรับการเขียน ในตัวอย่างข้างต้นฉันใช้ crypto. createRandomBytes () เพื่อสร้างบัฟเฟอร์ของข้อมูล แต่คุณสามารถใช้ข้อมูลไบนารีที่คุณสร้างหรืออ่านจากแหล่งอื่นได้อย่างง่ายดาย รู้ว่าเมื่อไฟล์ได้รับการเขียนอินพุตและเอาต์พุตเป็นการดำเนินการแบบอะซิงโครนัสใน Node. js ดังนั้นจะเกิดอะไรขึ้นหากเราต้องการทราบว่าเมื่อไฟล์ได้รับการเขียนขึ้นอย่างครบถ้วนคำตอบคือการตั้งค่าฟังให้กับเหตุการณ์ที่สตรีมมิ่งออก เหตุการณ์การจบ (เพิ่มใน Node. js v0.10) ระบุว่าข้อมูลทั้งหมดถูกล้างข้อมูลไปยังระบบต้นแบบ ใน Node. js ก่อน v0.10 คุณสามารถเพิ่ม cb ลงใน. end () เพื่อให้ได้ข้อบ่งชี้เมื่อได้รับการล้างข้อมูลแล้วอย่างไรก็ตามการพิจารณาจะต้องคำนึงถึงการแปลงข้อมูลอื่น ๆ ในลุ่มน้ำด้วยเช่นกัน การสร้างสตรีมที่สามารถเขียนได้ Node. js แบบกำหนดเองเมื่อคุณต้องการสร้างสตรีมที่สามารถเขียนได้เองเพื่อเก็บข้อมูลในฐานข้อมูลหรือสถานที่จัดเก็บข้อมูลอื่น ๆ จะเป็นเรื่องง่ายถ้าคุณใช้คลาสนามธรรมแบบใหม่ Streams2 ที่สามารถเขียนได้ใน Node. js 0.10 หรือผ่านทาง โมดูลอ่าน Polyfill NPM NPM ในการสร้างสตรีมที่เขียนได้ซึ่งจะใช้งานสตรีม Node. js แบบปกติทั้งหมดคุณต้องมีชั้นย่อยที่เขียนได้และใช้การเขียน (ก้อน, การเข้ารหัส, cb) การสร้างกระแสหน่วยความจำที่สามารถเขียนได้นี่คือตัวอย่างที่เขียนไปยังฐานข้อมูลหน่วยความจำภายในที่เรียบง่าย เราใช้ชื่อที่กำหนดไว้ในการสร้างสตรีมเป็นคีย์และเราผนวกข้อมูลเป็นค่าจนกว่าจะเสร็จสิ้น สตรีมที่สามารถเขียนได้อย่างสง่างามและใช้งานง่ายการเขียนข้อความหรือข้อมูลไบนารีไปที่สตรีม Node. js ทำได้อย่างง่ายดายและแม้แต่การสร้างสตรีมแบบกำหนดเองที่สามารถทำงานได้อย่างสมบูรณ์ก็คือการเดินเล่นในสวนสาธารณะด้วยฟังก์ชันการทำงานใหม่ของสตรีม 2 ที่เปิดตัวใน Node. js v0.10 (หรือ ใช้โมดูล polyfill readable-stream) อ่านเพิ่มเติมแบ่งปันหน้านี้

No comments:

Post a Comment