jay*_*h88 6 java postgresql file-io multithreading bufferedwriter
我试图使用多个线程在Java中编写一个巨大的文件.
我在Java中尝试了两个FileWriter和bufferedWriter类.
正在写入的内容实际上是使用CopyManager和写入的整个表(Postgres).文件中的每一行都是表格中的一个元组,我一次写入100行.
写作方法:
在追加模式下,多个线程打开单个待写文件.之后每个线程都尝试写入文件文件.
以下是我面临的问题:
Filewriter,我会在文件中看到一条黑线.有什么建议,如何避免这种数据完整性问题?
小智 13
根据定义写入普通文件是序列化操作.通过尝试从多个线程写入它来获得性能,I/O是一个有限的有限资源,其带宽比最慢或最负载最多的CPU低几个数量级.
如果你有多个线程进行昂贵的计算,那么你有选择,如果你只是使用多个线程,因为你认为你要加快速度,你只是反过来.争用I/O总是会降低对资源的访问速度,因为锁等待和其他开销,它永远不会加速.
您必须拥有受保护的关键部分,并且一次只允许一个编写者.只需查看支持并发的任何日志记录编写器的源代码,您将看到只有一个线程写入该文件.
如果您的申请主要是:
CPU绑定:你可以使用一些锁定机制/数据结构,让一个线程中的一个线程一次只能写入文件,从并发的角度来看,作为一个天真的解决方案是没用的; 如果这些线程是CPU绑定的I/O很少,这可能会起作用.
I/O界限:这是最常见的情况,您必须使用具有某种队列的消息传递系统,并将所有线程发布到队列/缓冲区并从中拉出一个线程并写入该文件.这将是最具扩展性和最易于实施的解决方案.
如果需要创建单个超大文件,其中写入顺序不重要且程序受CPU限制,则可以使用日记技术.
让每个process文件写入一个单独的文件,然后在最后将多个文件连接成一个大文件.这是一个非常古老的学校低技术解决方案,运行良好,并已有几十年.
显然,你拥有的存储I/O越多,这将在最终concat上执行得越好.