当前位置: 首页 > 面试题库 >

使用多个线程写入文件

郝昊东
2023-03-14
问题内容

我正在尝试使用多个线程在Java中编写一个大文件。

我已经尝试了Java FileWriterbufferedWriter类。

实际上,要写入的内容是使用CopyManager和写入的整个表(Postgres)。文件中的每一行都是表中的一个元组,我一次要写100行。

编写方法

单个待写入文件由附加模式下的多个线程打开。此后,每个线程都尝试写入文件文件。

以下是我面临的问题:

  • 有时,文件的内容将被覆盖,即:一行仍然不完整,而下一行从那里开始。我的假设是编写者的缓冲区已满。这迫使编写器立即将数据写到文件上。写入的数据可能不是完整的行,并且在可以写入其余数据之前,下一个线程将其内容写入文件。
  • 使用时Filewriter,有时我会在文件中看到一条黑线。

有什么建议,如何避免这种数据完整性问题?


问题答案:

共享资源==争用

根据定义写入普通文件是序列化操作。通过尝试从多个线程进行写入无法获得任何性能,I / O是有限的有限资源,其带宽甚至比最慢或最重载的CPU还要小几个数量级。

并发访问共享资源可能很复杂(并且速度很慢)

如果您有多个线程正在执行昂贵的计算,那么您可以选择,如果您只是因为考虑到要加快某些速度而仅使用多个线程,那么您将采取相反的做法。I /
O争用总是会减慢对资源的访问,而由于锁等待和其他开销,它永远不会加快对资源的访问。

您必须有一个受保护的关键部分,并且一次只允许一个编写者。只需查找任何支持并发的日志记录编写器的源代码,您就会看到只有一个线程可以写入文件。

如果您的应用程序主要是:

  1. CPU绑定: 您可以使用某种锁定机制/数据构造,一次只允许多个线程中的一个线程写入文件,从并发的角度来看,这是天真的解决方案;如果这些线程受CPU约束,但I / O很少,则可能会起作用。

  2. I / O绑定: 这是最常见的情况,您必须使用带有某种队列的消息传递系统,并将所有线程发布到队列/缓冲区,并从中提取单个线程并写入文件。这将是最具扩展性和最容易实现的解决方案。

日记-异步写入

如果您需要创建一个单个的超大文件,而该文件的写入顺序并不重要,并且该程序受CPU限制,则可以使用日记技术。

让每个process文件都写入一个单独的文件,然后将多个文件最后合并为一个大文件。这是一个非常古老的 低技术含量的
解决方案,效果很好,并且已经使用了数十年。

显然,您拥有的存储I / O越多,它将在最终连接上执行得越好。



 类似资料:
  • 问题内容: 我有20个线程用println()函数写入一个名为result.txt的文件。我该如何同步它们? 我注意到每次我的程序运行时,results.txt中的文本行数都会不同。 谢谢。 问题答案: 通过包含同步方法以写入文件的类访问文件。一次仅一个线程将能够执行该方法。 我认为Singleton模式适合您的问题: 每次需要写入文件时,只需调用:

  • 问题内容: 在多个线程上调用Java 对象是否安全?输出会正确序列化吗? 澄清: 在我的情况下,类记录器拥有FileOutputStream引用,并且多个线程可以调用记录器写,从而格式化输出并调用FileOutputStream写。 我应该同步记录器的写方法以保证来自多个线程的消息不会混合吗? 问题答案: 不能多次打开文件,因此答案是否定的。 在看到您的编辑之后,是的,您应该在记录器中引入同步,以

  • 本文向大家介绍C#实现多线程写入同一个文件的方法,包括了C#实现多线程写入同一个文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现多线程写入同一个文件的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 如果您曾经使用过p2p下载软件,则他们可以使用多线程下载文件,并且只能创建一个文件,所以我想知道线程如何将数据写入该文件。顺序还是并行? 想象一下,您想将大数据库表转储到文件中,以及如何使这项工作更快? 问题答案: 您可以使用多个线程将a写入文件(例如日志文件)。但是您必须协调@Thilo指出的线程。您需要同步文件访问并仅写入整个记录/行,或者需要制定一种策略来将文件的区域分配给不同的

  • 问题内容: 我正在尝试使用线程下载多个与模式匹配的文件。该模式可以匹配1或5或10个差异大小的文件。 为了简单起见,可以说下载文件的实际代码在downloadFile()方法中,而fileNames是与模式匹配的文件名列表。我该如何使用线程。每个线程将仅下载一个文件。建议在for循环内创建一个新线程。 问题答案: 您确实想使用ExecutorService而不是单个线程,它更干净,性能可能更高,并

  • 问题内容: 我是Python多线程的新手,目前正在编写一个附加到csv文件的脚本。如果要向提交多个线程,则将行追加到csv文件中。如果附加是这些线程执行的唯一与文件相关的操作,我该怎么做才能保证线程安全? 我的代码的简化版本: 我的线程类是: 我应该设置一个单独的单线程执行程序来处理编写,还是担心我是否只是追加? 编辑:我应该详细说明,下一次附加文件之间的分钟之间,写操作发生的时间可能会相差很大,