使用 libtorrent 对 torrent 下载序列进行优先级排序

Posted

技术标签:

【中文标题】使用 libtorrent 对 torrent 下载序列进行优先级排序【英文标题】:prioritizing torrent download sequences using libtorrent 【发布时间】:2013-01-15 14:10:06 【问题描述】:

假设我有 2 个以上的客户(由我开发)全部使用 libtorrent (http://www.rasterbar.com/products/libtorrent/manual.html#queuing)

我能否有效地优先考虑从其他客户端下载文件,以便他们从文件开头到结尾下载文件的片段/块(无论是什么种子术语),而不是完全按照随机顺序?

(当然,出于可用性和性能的原因,我允许一些“多路复用”/“交织”片段,但这里的目标是从文件开头到结尾尽可能线性且快速地下载)

我在这里考虑的目标显然是快速预览文件。如何使用 libtorrent / 可能的其他 C++ 种子库最有效地做到这一点?

(我对使用非二进制语言(如 Java 或 Python)的 torrent 实现不太感兴趣 - 出于性能和安全性的原因,我需要机器代码,因此,C、C++ 或可能 D 都符合要求)

【问题讨论】:

许多客户端似乎能够优先处理某些文件。我不知道是否可以通过 libtorrent。 【参考方案1】:

您当然可以使用torrent_handle::prioritize_pieces()torrent_handle::prioritize_files() 对片段和文件进行优先级排序。见the documentation。

但这还不足以按顺序下载。为此,您可以使用torrent_handle::set_sequential_download() 启用顺序下载。这将按顺序发出新的工件请求。请记住,满足请求所需的时间会因您与哪个对等方交谈而有很大差异。按顺序提出请求并不一定意味着按顺序接收。

还有另一种机制可以尝试这样做。 torrent_handle::set_piece_deadline() 用于设置一个片段的目标完成时间。这些片段被认为是时间关键片段,它们按截止日期排序,最快的对等节点用于从这些片段中请求块,并尝试按截止日期顺序下载它们。

现在,我还觉得您希望两个独立的客户端(可能在不同的机器上运行)来协调他们下载的部分。是对的吗?尚不完全清楚您在问什么,但没有简单的方法可以要求 libtorrent 这样做。

您可以为 libtorrent 编写一个插件,为这些客户端实现一个新的扩展消息以进行聊天和协调,这可以取消选择其他客户端正在下载的某些片段,方法是将其优先级设置为 0。

【讨论】:

重新同步:不完全是,我希望 1 个客户端“尽可能按顺序”从其他 n 个播种该文件的客户端下载。这是完全合法的内容的特殊应用程序。 :-) 关于 complete 同步并以严格的方式排序下载,不,这不是我所追求的,我在“软”同步之后,即“尝试按顺序下载可能,但不会以牺牲下载速度为代价”,像这样。 set_sequential_download() 可能只是解决问题。不管怎样,你的回答很好,谢谢!!

以上是关于使用 libtorrent 对 torrent 下载序列进行优先级排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python-libtorrent 获取 torrent 的对等列表?

我无法从公共跟踪器 libtorrent 下载 torrent

Libtorrent torrent->磁铁

使用 libtorrent-python 下载 Torrent

使用 Libtorrent save_state() 保存单个 Torrent?

您如何获得 libtorrent 中 torrent 的总大小?