[megoldva] Nagy fájl darabjainak gyors összekapcsolása

Fórumok

Van néhány fájlom (xaa, xab...), melyek gigabájtos nagyságúak. Összekapcsolhatom őket ugyan egy cat xa? > egyben paranccsal is, de ez lassú, és felesleges duplikációt hoz létre a tárterületen. El lehet-e valami (fájlrendszer szintű) megoldással érni azt, hogy az xaa végét odakapcsoljuk az xab elejéhez, az xab végét az xac elejéhez stb., mely folyamat végén az egész fájl olyan lesz, mintha cattel kapcsoltuk volna össze?

Szerk: Ahogy látom, ezzel már más is küzdött - http://stackoverflow.com/questions/5893531/fast-concatenate-multiple-fi…

Hozzászólások

Nem próbáltam ki, de:

mkfifo /tmp/fifo0 && cat xa? > /tmp/fifo0

Másik terminálban (vagy screen vagy &, stb. tetszés szerint) pl. mplayer /tmp/fifo0

Bár ilyenkor a seek ugye minimum problémás, szóval aligha 100%-os megoldás.

Ha mplayerrel való lejátszáshoz kell, akkor egyszerűbb megoldás is van.

mplayer -fs <és itt felsorolod, amiket akarsz. A shell *-ja is játszik>

és lejátsza az összeset fullscreenben.

A Linux userspace fájlrendszer API-jának (fusermount) segítségével lehet írni erre modult. Még magasszintű nyelvekhez is van illesztője. Egyszer brahiból még Javában is írtam fájlrendszer illesztőt egy tutorial alapján. Tehát írsz egyet, ami a darabokból katalógust épít magában, és az olvasási műveleteket megvalósítja a forrásokra mappeléssel, majd ezt mountolod, és kész is vagy :-).

Ez szimpatikus, de mivel még sohasem csináltam ilyet, kérnék egy kis támogatást.
Itt is vannak példa szkriptek (pl. "Join 2 devices together"), de ezek mintha már létező device-okat matatnának. Nekem egyelőre 4 db egyszerű fájlom van (xa*), amiből 3 db 2GB-os, meg egy kisebb. Hogy kell elkészíteni a kívánt device-okat? (MAKEDEVvel? S hogy lehet elérni, hogy ne kapjak "BLKGETSIZE: A függvény nincs megvalósítva" hibajelzéseket a blockdev --getsize használatakor?)

Teljesen jó, amit írsz. Ezután:
losetup -v -f xaa; losetup -v -f xab; losetup -v -f xac; losetup -v -f xad
már jöhet is az összefűzés: http://pastebin.com/PtEDQH7G
Majd pedig mplayer /dev/loop0 szépen lejátssza, amit kell (egybefűzve, teljes értékű fájlként).

Ami még kérdésként maradt bennem: hogy lehet ezt az állapotot visszacsinálni?

Köszi! (Jól írod az mplayer paraméterét; csak tévedésből ment a loop0... (a film eleje).)

Összefoglalás (ha a "joinus" szkriptbe tesszük a fent idézett pastebin-es részt):

for i in xa*; do losetup -v -f $i; done; ./joinus /dev/loop{0..3}
mplayer /dev/mapper/joined

Majd utána a "takarítás": dmsetup remove joined; losetup -d /dev/loop[0123]

Eredetileg csak rootként látom a /dev/mapper/joined fájlt, de ez orvosolható egy chown envagyok /dev/mapper/joined paranccsal.

Ez majdnem jo, csak arra keszulj fel, hogy nem biztos, h loop[0-3] neven jonnek letre losetup-pal a fajlok. Pont azert van -v hogy lasd miket osztott ki a rendszer, illetve a -f azt helyettesiti, hogy te kezzel megadjad (mondhatod azt is, h losetup -v /dev/loop0 xaa, ebben az esetben meg szepen hibauzenetet kapsz, ha mar hasznalatban van)