将下载的torrent保存在内存中,而不是文件libtorrent 使用RestBar LIB Trand我不希望下载的数据坐在硬盘上,而不是管道或变量或软的东西,这样我就可以将它重定向到其他地方,MySQL,甚至垃圾,如果不是我想要的,那么不管是在C++中使用LyTrTror?

将下载的torrent保存在内存中,而不是文件libtorrent 使用RestBar LIB Trand我不希望下载的数据坐在硬盘上,而不是管道或变量或软的东西,这样我就可以将它重定向到其他地方,MySQL,甚至垃圾,如果不是我想要的,那么不管是在C++中使用LyTrTror?,c++,python,bittorrent,C++,Python,Bittorrent,编辑:-->我想指出这是一个libtorrent问题,而不是Linux文件处理或Python文件处理问题。我需要告诉libtorrent,不要将文件传统地保存在普通文件中,而是将其保存到python管道或变量等中。尝试为库提供一个“文件句柄”,而不是真正的文件句柄。这适用于大多数python库 如果您使用的是Linux,那么您可以下载到tmpfs挂载中;这将避免写入磁盘。这就是说,这显然意味着您正在RAM中存储大文件;确保你有足够的内存来处理这个问题 还要注意,大多数Linux发行版在/dev/

编辑:-->我想指出这是一个libtorrent问题,而不是Linux文件处理或Python文件处理问题。我需要告诉libtorrent,不要将文件传统地保存在普通文件中,而是将其保存到python管道或变量等中。

尝试为库提供一个“文件句柄”,而不是真正的文件句柄。这适用于大多数python库

如果您使用的是Linux,那么您可以下载到tmpfs挂载中;这将避免写入磁盘。这就是说,这显然意味着您正在RAM中存储大文件;确保你有足够的内存来处理这个问题


还要注意,大多数Linux发行版在
/dev/shm
处都有tmpfs挂载,因此您可以简单地将libtorrent指向那里的文件。

您可以通过实现自己的存储类来实现这一点,以便与libtorrent一起使用。不幸的是,这是不可能在Python中完成的,但是你可以在C++中完成。它的文档有点稀少,可以找到

下面是一个简单的示例,说明如何将所有数据存储在RAM中:

struct temp_storage : storage_interface
{
   temp_storage(file_storage const& fs) : m_files(fs) {}
   virtual bool initialize(bool allocate_files) { return false; }
   virtual bool has_any_file() { return false; }
   virtual int read(char* buf, int slot, int offset, int size)
   {
      std::map<int, std::vector<char> >::const_iterator i = m_file_data.find(slot);
      if (i == m_file_data.end()) return 0;
      int available = i->second.size() - offset;
      if (available <= 0) return 0;
      if (available > size) available = size;
      memcpy(buf, &i->second[offset], available);
      return available;
   }
   virtual int write(const char* buf, int slot, int offset, int size)
   {
      std::vector<char>& data = m_file_data[slot];
      if (data.size() < offset + size) data.resize(offset + size);
      std::memcpy(&data[offset], buf, size);
      return size;
   }
   virtual bool rename_file(int file, std::string const& new_name) { assert(false); return false; }
   virtual bool move_storage(std::string const& save_path) { return false; }
   virtual bool verify_resume_data(lazy_entry const& rd, error_code& error) { return false; }
   virtual bool write_resume_data(entry& rd) const { return false; }
   virtual bool move_slot(int src_slot, int dst_slot) { assert(false); return false; }
   virtual bool swap_slots(int slot1, int slot2) { assert(false); return false; }
   virtual bool swap_slots3(int slot1, int slot2, int slot3) { assert(false); return false; }
   virtual size_type physical_offset(int slot, int offset) { return slot * m_files.piece_length() + offset; };
   virtual sha1_hash hash_for_slot(int slot, partial_hash& ph, int piece_size)
   {
      int left = piece_size - ph.offset;
      TORRENT_ASSERT(left >= 0);
      if (left > 0)
      {
         std::vector<char>& data = m_file_data[slot];
         // if there are padding files, those blocks will be considered
         // completed even though they haven't been written to the storage.
         // in this case, just extend the piece buffer to its full size
         // and fill it with zeroes.
         if (data.size() < piece_size) data.resize(piece_size, 0);
         ph.h.update(&data[ph.offset], left);
      }
      return ph.h.final();
   }
   virtual bool release_files() { return false; }
   virtual bool delete_files() { return false; }

   std::map<int, std::vector<char> > m_file_data;
   file_storage m_files;
};
从这一点上讲,将其存储在MySQL数据库或任何其他后端应该是相当直接的。

我在Go中有一个torrent客户端就是为了这个目的。我希望能够直接处理和控制数据,用于编写torrentfs,并拥有S3和各种数据库的存储后端


将内存中的存储后端插入到该客户机是很简单的。

问题是,python绑定没有很好的文档记录,它不需要句柄,只需要路径地址,或者至少我认为它需要:(这听起来不错,但我确信一定有办法通过libtorrent本身来实现。是否有可能为libtorrent-1.2.0更新此功能?此外,为了将数据映射到文件中的最终目的地,似乎还有很多事情要做。事实上(
readwritev
)现在,只需覆盖默认存储并仅更改
readv
writev
的某些部分就更简单了。您能提供或告诉我在哪里可以找到实现此功能的MWE吗?即下载torrent(最好是特定文件)到内存?我对这个功能感兴趣,因为我想一个文件一个文件地下载一个torrent文件到远程存储后端(Google Drive)。@YenForYang您应该将这些问题直接发送到
storage_interface* temp_storage_constructor(
   file_storage const& fs, file_storage const* mapped
   , std::string const& path, file_pool& fp
   , std::vector<boost::uint8_t> const& prio)
{
   return new temp_storage(fs);
}