Mengunduh torrent 16GB melalui tablet dengan ruang kosong 4GB
Tugas:
Ada PC tanpa Internet, tetapi dimungkinkan untuk mentransfer file melalui USB. Ada tablet dengan Internet tempat file ini dapat ditransfer. Anda dapat mengunduh torrent yang diperlukan di tablet Anda, tetapi ruang kosong tidak cukup. File di torrent itu satu dan besar.
Jalan menuju solusi:
Saya memulai torrent untuk mengunduh. Ketika ruang kosong hampir habis, saya menghentikan sementara pengunduhan. Saya menghubungkan tablet ke PC dan memindahkan file dari tablet ke PC. Saya berhenti sejenak dan yang mengejutkan saya, file tersebut dibuat lagi dan torrent terus diunduh seolah-olah tidak terjadi apa-apa.
Karena kenyataan bahwa klien torrent menyetel tanda sparse ke file tempat ia menulis data yang diterima, sistem tidak mencoba mencadangkan 16 GB sekaligus dan kesalahan tidak akan terjadi saat mencoba menulis ke file yang melebihi 4 GB.
Setelah mengulangi prosedur ini empat kali, saya menerima empat file di PC saya yang berisi bagian berbeda dari torrent yang sama. Sekarang yang tersisa hanyalah menyatukannya. Prosedurnya pada dasarnya sederhana. Anda perlu mengganti byte nol dengan nilai lain jika nilai tersebut ada pada posisi tertentu di salah satu dari empat file.
Bagi saya, program sederhana seperti itu seharusnya ada di Internet. Apakah tidak ada yang pernah mengalami masalah seperti itu? Namun saya menyadari bahwa saya bahkan tidak tahu kata kunci apa yang harus dicari untuk itu. Oleh karena itu, saya segera membuat skrip Lua untuk tugas ini dan sekarang saya telah mengoptimalkannya. Inilah yang ingin saya bagikan.
Mengunduh torrent sebagian
mulai mengunduh torrent di perangkat pertama
tunggu sampai ROM terisi
jeda pengunduhan
transfer file ke perangkat kedua dan tambahkan nomor ke nama file
kita kembali ke poin pertama sampai file terdownload sepenuhnya
Menggabungkan bagian-bagian menjadi satu file
Setelah bagian terakhir diterima, perlu untuk mengumpulkannya menjadi satu file utuh.
Tugasnya sederhana:
Membaca semua bagian sekaligus
Jika di beberapa bagian posisinya bukan byte nol, maka kita tuliskan ke output, jika tidak kita tulis nol
Fungsi merge_part menerima serangkaian utas streams_in yang bertuliskan sebagian ukuran buffer_length dan mengembalikan hasil penggabungan bagian-bagian dari utas yang berbeda.
function merge_part(streams_in, buffer_length)
local out_part
for _, stream in ipairs(streams_in) do
local in_part = stream:read(buffer_length)
if not out_part then
out_part = in_part -- просто копируем часть из первого файла
elseif in_part and #in_part > 0 then
if #out_part < #in_part then
out_part, in_part = in_part, out_part
end
if out_part ~= in_part -- данные различаются
and in_part:find("[^ ]") -- есть данные в in_part
and out_part:find(" ", 1, true) -- есть пустые места в out_part
then
local find_index = 1
--[[
Fungsi string.gsub cocok untuk tugas tersebut karena ia akan menemukan potongan yang berisi angka nol dan memberikan apa yang diberikan padanya.
--]]
out_part = out_part:gsub(" +", function(zero_string)
if #in_part < find_index then
return -- не на что менять
end
--[[
string.gsub tidak menyampaikan posisi di mana kecocokan itu ditemukan. Oleh karena itu, kami melakukan pencarian paralel untuk posisi tersebut zero_string menggunakan fungsi string.find. Cukup dengan menemukan byte nol pertama.
Sekarang jika masuk in_part ada data untuk out_part salin mereka.
--]]
if #in_part >= start_index then
local end_index = start_index + #zero_string - 1
--[[
Potong dari in_part bagian yang sesuai dengan urutan angka nol.
--]]
local part = in_part:sub(start_index, end_index)
if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[
В part ada data.
--]]
if #part == #zero_string then
return part
else
--[[
part ternyata kurang dari barisan angka nol. Mari kita lengkapi dengan mereka.
--]]
return part..zero_string:sub(1, end_index - #in_part)
end
end
end
end)
end
end
end
return out_part
end
Kesimpulan
Dengan demikian, kami dapat mengunduh dan merakit file ini di PC. Setelah penggabungan, saya mengeluarkan file torrent dari tablet. Saya memasang klien torrent di PC saya dan memeriksa file dengannya.
Bagian yang terakhir diunduh di tablet dapat dibiarkan di distribusi, tetapi Anda harus mengaktifkan pemeriksaan ulang bagian-bagian tersebut sebelum ini dan menghapus centang pada file agar tidak diunduh lagi.