2011-09-21 99 views
0

我正在使用Camel将一些字符串(100,000s)写入文本文件集。Apache Camel文件输出组件性能较慢 - Java

下面的代码显示了我的骆驼航线:

from("seda:fileOutputMatchedMsgClose?concurrentConsumers=44") 
.to("file:MATCHED_CLOSE?fileExist=Append") 
.end(); 

所以基本上发生的事情是我有一个制片人豆这是创建于加工进一步上行目标这些字符串。我将头文件名设置为生产者bean的sendbody和header方法的一部分。所以我有22个正在写入的文件(全部在MATCHED_CLOSE文件夹中)。这22个文件的消息全部发送到一个SEDA端点(fileOutputMatchedMsgClose)。

问题是应用程序发送大约440个字符串到SEDA端点一秒钟。并且查看JConsole中fileOutputMatchedMsgClose的队列大小,它随着内存使用量的增长而不断增长。所以看起来这里有一点瓶颈。

对于如何获得更好的表现,任何人都不会有任何建议,440文件中的每一行都写入280chars左右,不是很大。所以我想问题是我可以做些什么优化来提高Camel中文件组件的性能(也许为每个文件创建多个路径(这会很痛苦),还是应该编写自己的文件IO bean来处理这个?

干杯!

回答

2

你的课程,由磁盘的IO速度的限制。所以,你需要能够写440个文件/秒。

现在都是那些440文件独特的文件名?我问,因为你有?fileExist = Append

骆驼文件组件将串行化写到相同的文件名,所以如果所有的440都写入相同的文件名,他们按顺序执行此操作。这样做的一个原因是骆驼社区用户在并行写入同一文件时报告了“丢失的写入”。

骆驼使用NIO API写入文件,所以我怀疑你可以让它变得更快。

3

如何使用聚合器或自定义处理器将字符串合并为较大的字符串。如果你只写一个文件,那么这可能会提高性能很多。当然,这意味着在写入之前你会有一些延迟,当发生崩溃时你可能会丢失一些数据。

0

如果可以,请切换到stream而不是使用file。它的功能更少,性能更好。

file组件使用GenericFileProducer其具有在写入文件包括通过一个同步块去,保持LRUCache和每个时间和定位开口目标文件到文件的末尾为追加,和其他活动显著开销。

如果通过将多个项目写入单个文件来满足您的要求,那么stream组件可能是更好的选择。 StreamProducer仍然使用同步块来防止对文件进行多个并发写入,但只要正在写入相同的文件,就会维护单个打开文件的句柄,并且代码少且开销少。

0

虽然内容写入到骆驼路径的文件,你可以使用3个选项:

  • 骆驼文件
  • 骆驼汇聚
  • 骆驼流

使用的聚合器,你可以结合交换并将它们写入文件中,即写入文件的次数将大幅减少,您将能够看到吞吐量有所增加。

另一个选择是简单地使用驼峰流组件。它像一个魅力。我已经用它,在我的经验总执行时间可从几小时缩短到几分钟

您可以在这里看到我的帖子每个它们之间的区别:

https://onegoodexample.wordpress.com/2016/07/10/apache-camel-throughput-or-performance-improvement-while-writing-into-files/

谢谢, Kalyan