我有几个数据文件(每个文件接近1GB),其中的数据是字符串行。
我需要使用数百个消费者处理每个文件。每个消费者执行的处理与其他消费者不同。消费者不会同时写入任何地方,他们只需要输入字符串。处理后,他们会更新本地缓冲区。消费者可以轻松并行执行。
重要提示:对于一个特定的文件,每个消费者必须按照正确的顺序(按照它们在文件中出现的顺序)处理所有行,不能跳过。处理不同文件的顺序无关紧要。
单个消费者处理单个行的速度相对较快。我预计在Core i5上少于50微秒。
现在我正在寻找解决这个问题的好方法。这将成为.NET项目的一部分,请让我们仅使用.NET(C#优先)。
我知道TPL和DataFlow。我想最相关的应该是BroadcastBlock。但是我认为问题在于,对于每一行,我都必须等待所有消费者完成才能发布新的行。我想这可能不太有效率。
我认为理想情况应该是这样的:
1. 一个线程从文件中读取并写入缓冲区。 2. 每个消费者准备就绪时,从缓冲区并发读取行并进行处理。 3. 当一个消费者读取输入后,缓冲区中的条目不应被删除。只有当所有消费者都处理完毕后,它才能被删除。 4. TPL自己安排消费者线程。 5. 如果一个消费者的性能优于其他消费者,则它不应等待,并且可以从缓冲区读取更新的条目。
我的想法是否正确?无论是还是否,如何实现好的解决方案?
我需要使用数百个消费者处理每个文件。每个消费者执行的处理与其他消费者不同。消费者不会同时写入任何地方,他们只需要输入字符串。处理后,他们会更新本地缓冲区。消费者可以轻松并行执行。
重要提示:对于一个特定的文件,每个消费者必须按照正确的顺序(按照它们在文件中出现的顺序)处理所有行,不能跳过。处理不同文件的顺序无关紧要。
单个消费者处理单个行的速度相对较快。我预计在Core i5上少于50微秒。
现在我正在寻找解决这个问题的好方法。这将成为.NET项目的一部分,请让我们仅使用.NET(C#优先)。
我知道TPL和DataFlow。我想最相关的应该是BroadcastBlock。但是我认为问题在于,对于每一行,我都必须等待所有消费者完成才能发布新的行。我想这可能不太有效率。
我认为理想情况应该是这样的:
1. 一个线程从文件中读取并写入缓冲区。 2. 每个消费者准备就绪时,从缓冲区并发读取行并进行处理。 3. 当一个消费者读取输入后,缓冲区中的条目不应被删除。只有当所有消费者都处理完毕后,它才能被删除。 4. TPL自己安排消费者线程。 5. 如果一个消费者的性能优于其他消费者,则它不应等待,并且可以从缓冲区读取更新的条目。
我的想法是否正确?无论是还是否,如何实现好的解决方案?