2011-05-22 111 views
2

與Rasterbar libtorrent工作,我不想下載的數據坐在我的硬盤上,而管道或變量或軟的東西,所以我可以將其重定向到其他地方時,MySQL,甚至垃圾如果它不是我想要的,是否有這樣做最好是python綁定,如果不是在C++中使用Libtorrent?保持下載的洪流在內存中,而不是文件libtorrent

編輯: - >我想指出,這是一個libtorrent問題不是Linux的文件處理或Python文件處理的問題。我需要告訴libtorrent,而不是將文件保存在傳統的文件中保存到我的python管道或變量等。

回答

6

您可以通過實施您自己的存儲類來與libtorrent一起使用。不幸的是,這在python中是不可能的,但你可以用C++來完成。它的文檔有點稀缺,可以找到here

這裏有一個如何通過存儲在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; 
}; 

你想也需要一個構造函數中通過add_torrent_params結構通過添加一個任務時:

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); 
} 

從這一點來說,應該是相當簡單的將其存儲在MySQL數據庫或任何其他後端。

0

嘗試給庫提供一個cStringIO「文件句柄」而不是真正的文件句柄。這適用於大多數python庫。

+0

問題是,python綁定沒有很好的文檔記錄,它不需要處理它只需要一個路徑地址或至少我認爲它確實:( – Max 2011-05-22 19:10:14

4

如果你在Linux上,你可以使用tmpfs裝載;這將避免寫入磁盤。這就是說,這顯然意味着你正在將大文件存儲在RAM中;確保你有足夠的內存來處理這個問題。

還要注意的是大多數Linux發行版有一個掛載tmpfs在/dev/shm,所以你可以簡單地指向libtorrent到一個文件中有。

+0

這聽起來不錯,但我很確定必須有一種方法通過libtorrent本身來做到這一點。 – Max 2011-05-22 20:10:45

0

我已經implemented洪流客戶端去只是爲了這個目的。我希望能夠直接處理和控制數據,用於寫入torrentfs,並將存儲後端分配給S3和各種數據庫。

這將是微不足道在內存存儲後端此客戶端堵塞。

相關問題