正如文档所述,并且 Adonis 已经提到了这一点,一次只能由一个线程执行写入。您不会通过并发获得性能提升,此外,如果这是一个实际问题,则只应担心性能,因为并发写入磁盘实际上可能会降低性能(SSD可能比HDD少)。
在大多数情况下,底层媒体(SSD,HDD,网络)是单线程的 - 实际上,在硬件级别上没有线程这样的东西,线程只不过是一种抽象。
在您的情况下,介质是SSD。虽然SSD内部可以同时将数据写入多个模块(它们可能会达到一种帕勉程度,其中写入速度可能相同,甚至优于读取),但内部映射数据结构是共享资源,因此是有争议的,特别是在频繁更新(如并发写入)上。尽管如此,此数据结构的更新速度非常快,因此除非它成为问题,否则无需担心。
但除此之外,这些只是SSD的内部功能。在外部,您通过串行 ATA 接口进行通信,因此一次一个字节(实际上是帧信息结构 FIS 中的数据包)。除此之外,还有一个操作系统/文件系统,它再次具有可能争用的数据结构和/或应用自己的优化方法,例如写后缓存。
此外,当您知道媒体是什么时,您可能会特别针对此进行优化,并且当单个线程写入大量数据时,SSD的速度非常快。
因此,您可以创建一个大型内存中缓冲区(可能考虑内存映射文件)并同时写入此缓冲区,而不是使用多个线程进行写入。内存本身不会争用,只要您确保每个线程访问其自己的缓冲区地址空间即可。完成所有线程后,将此缓冲区写入 SSD(如果使用内存映射文件,则不需要)。
另请参阅有关SSD开发的精彩摘要:摘要 - 每个程序员都应该了解的有关固态硬盘的信息
进行预分配(或者更确切地说,是 精确映射到 )的要点是,调整文件的大小可能会使用额外的周期,而您可能不会避免这种情况。但同样,这可能取决于操作系统/文件系统。file_.setLength()
ftruncate