二进制文件最快的搜索算法?
我正在寻找最快、最好的算法来将某些值搜索到一个非常大的二进制文件(类似于 2 GB AFP 文件)中,这意味着将整个数据加载到内存中肯定是不可想象的。我正在使用 C#,我不知道是否有其他编程语言(C/C++..)会更快,否则我将继续使用 C#。 感谢您的任何想法。
I'm looking for the fastest and the best algorithm to search some values into a very huge binary file (kind of 2 GB AFP file), wich means that loading the whole data in memory must be inconceivable. I'm working with C# and i don't know if any other programing language (C/C++..) would be really much faster, otherwise i'll continue with C#.
Thanks for any ideas.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Boyer-Moore 在性能和复杂性(以及链接的文章中有其他方法的链接。C
实现(链接中的源代码)将比 C# 快得多,尽管在实践中您可能会发现磁盘 I/O 是最大的障碍。
Boyer-Moore offers a good compromise between performance and complexity (and the linked articles has links to other methods.
An implementation in C (source code in link) will be significantly faster than C#, although in practice you'll probably find that disk I/o is the biggest hurdle.
经过评论,我决定提供一个可能的解决方案。
请注意:这个解决方案不是最好的,也不是优雅的。
使用它作为起点:
可以根据需要修改(增加)
BUFFER
。After commenting, I decided to provide a possible solution.
Be careful: this solution is not the best nor elegant.
Use it as a starting point:
BUFFER
could be modified (increased) as you please.您必须加载整个文件才能搜索该对象。如果可能的话,根据唯一的 ID 拆分文件(如果有)。就像根据唯一 id 或其他一些参数将文件拆分为每 100 条记录(1-100、101-200、201-300 等)。它是一种对二进制文件的索引。
You have to load entire file to search the object. If possible split the files based on unique id's if you have. Like split a file for each 100 records (1-100, 101-200, 201-300 etc) based on unique id's or some other params. It is kind of indexing your binary file.
您可以使用 TextReader.ReadBlock 方法。
逐块读取文件并查找请求的值。
或者甚至更好地使用 BinaryReader.ReadBytes 方法。
You can use TextReader.ReadBlock Method.
Read the file block by block and look for the requested values.
Or even better use BinaryReader.ReadBytes Method.