面试题答案
一键面试可读流和可写流高水位线(highWaterMark)的作用
- 可读流:
- 作用:可读流的高水位线
highWaterMark
表示内部缓冲区的大小。当缓冲区中的数据量达到高水位线时,可读流会暂时停止从底层资源(如文件系统)读取数据,直到缓冲区中的数据被消费(通过read()
方法读取或监听data
事件),以避免缓冲区溢出。例如,在读取大文件时,如果高水位线设置为 64KB,当缓冲区中的数据达到 64KB 时,流会暂停读取,等待应用程序处理这些数据。
- 作用:可读流的高水位线
- 可写流:
- 作用:可写流的高水位线
highWaterMark
决定了写入缓冲区何时被认为是“满”的。当写入的数据量累计达到高水位线时,调用write()
方法会返回false
,提示调用者暂时停止写入,直到可写流内部缓冲区的数据被排空(通过drain
事件通知)。例如,在向文件写入数据时,如果高水位线为 32KB,当写入的数据量累计达到 32KB 时,write()
方法会返回false
,此时应用程序应暂停写入,等待drain
事件触发后再继续写入。
- 作用:可写流的高水位线
如何根据具体业务场景合理选择高水位线的值
- 考虑内存使用:
- 内存紧张场景:如果系统内存有限,应设置较小的高水位线值。比如在嵌入式设备或内存资源受限的服务器上处理大文件,将可读流高水位线设为 8KB,可写流设为 4KB,这样可以减少内存占用,避免因内存不足导致程序崩溃。
- 内存充足场景:在内存充足的服务器上,可适当提高高水位线值以提高性能。例如,将可读流高水位线设为 128KB,可写流设为 64KB,这样可以减少读写操作的次数,提高数据传输效率。
- 考虑数据处理速度:
- 快速处理场景:如果应用程序对数据处理速度很快,能够及时消费可读流的数据或处理可写流的写入,可以设置较大的高水位线值。比如在数据转换处理简单且高效的场景下,将可读流高水位线设为 256KB,可写流设为 128KB,能充分利用系统资源,加快大文件处理速度。
- 慢速处理场景:若数据处理逻辑复杂,速度较慢,应设置较小的高水位线值。例如在对大文件进行复杂加密或格式转换时,将可读流高水位线设为 16KB,可写流设为 8KB,避免缓冲区堆积过多数据导致内存压力过大。
- 网络传输场景:
- 高带宽稳定网络:在网络带宽高且稳定的情况下,可适当提高可写流的高水位线值,如设为 100KB,以便充分利用网络带宽,快速将数据发送出去。
- 低带宽不稳定网络:对于低带宽或不稳定的网络,应降低可写流高水位线值,如设为 16KB,减少因网络延迟或丢包导致的缓冲区溢出问题,保证数据可靠传输。