Questo post riguarda principalmente l'utilizzo delle funzionalità SQL di JMP, ma tocca anche XML, Linux, MythTV.
Documento SQL Query Builder: https://www.jmp.com/support/help/14/query-builder.shtml#
MitoTV https://www.mythtv.org/ è un programma open source (TANSTAAFL) in grado di registrare trasmissioni TV via etere utilizzando una scheda di sintonizzazione in un PC (e anche un sacco di altre cose). È un ottimo modo per conoscere Linux e MySQL/MariaDB ed evitare di guardare la TV. L'implementazione utilizza due computer, un backend (o più) che esegue la registrazione e un frontend (o più) che esegue la visione. Un database SQL tiene traccia di cosa registrare e cosa è stato registrato.
https://code.mythtv.org/trac/ticket/12974#no1 descrive un motivo per cui ci sono molti file molto vecchi e molto grandi sul disco di backend di MythTV che non sono visibili nel frontend di MythTV. Dice che c'è un bug MythTV attorno al campo del database deletepending che impedisce l'eliminazione del file se MythTV si arresta in modo anomalo tra il momento in cui il campo è impostato e il file viene eliminato.
Ad esempio, utilizzando Linux ls comando per elencare alcuni file, ecco un esempio da 3 GB (è dicembre 2019; solo circa due settimane di file si adattano al disco 3T; questi file dovrebbero essere spariti da tempo.)
-rw-r--r-- 1 mitotv mitotv 3.1 G 21 marzo 2018 1051_20180321073000.ts
Oppure, dopo aver eseguito un'importazione del database,
JMP data table imported from database showing old, large filesTabella dati JMP importata dal database che mostra file vecchi e di grandi dimensioni
L'importazione del database sembra utile; mette colonne (o campi) una accanto all'altra che hanno valori correlati e combina informazioni da diverse tabelle nel database. Ecco i passaggi per farlo.
Individua le credenziali del database.
Su un sistema Linux che esegue il frontend MythTV, ci sarà un file ~/.mythtv/config.xml .
<CONFIGURATION>
<LOCALHOSTNAME>my-unique-identifier-goes-here</LOCALHOSTNAME>
<DATABASE>
<PINGHOST>1</PINGHOST>
<HOST>closet.local</HOST>
<USERNAME>mythtv</USERNAME>
<PASSWORD>this is the pw</PASSWORD>
<DATABASENAME>mythconverg</DATABASENAME>
<PORT>3306</PORT>
</DATABASE>
<WAKEONLAN>
<ENABLED>0</ENABLED>
<SQLRECONNECTWAITTIME>0</SQLRECONNECTWAITTIME>
<SQLCONNECTRETRY>5</SQLCONNECTRETRY>
<COMMAND>echo 'WOLsqlServerCommand not set'</COMMAND>
</WAKEONLAN>
<UPNP>
<UDN>
<MEDIARENDERER>52d20477-fda1-4e42-9edd-5992bd0ca45f</MEDIARENDERER>
</UDN>
</UPNP>
</CONFIGURATION>
Copia il file in un punto in cui la tua copia di JMP possa leggerlo e, con JMP 15, aprilo in questo modo:
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
che creerà un tavolo nascosto come questo
JMP data table loaded from XML file with one row and columns for UserName, Password, and DatabaseNameTabella dati JMP caricata da file XML con una riga e colonne per nome utente, password e nome database
Closet.local è il nome dell'host di back-end, mythtv è il nome utente SQL che ha accesso al database mythconverg e 3306 è la porta predefinita, quindi non sarà necessaria.
Creare un DSN utilizzando Windows ODBC Data Source Administrator.
Probabilmente hai bisogno dei driver a 64 bit e potresti aver bisogno di scaricarli. https://dev.mysql.com/downloads/connector/odbc/ o forse https://downloads.mariadb.org/connector-odbc/+releases/ . Sono abbastanza sicuro che sto effettivamente eseguendo MariaDB sul mio server back-end e utilizzando il connettore MySQL sul front-end. https://www.google.com/search?q=mysql+vs+mariadb
The Windows ODBC Data Source Administrator sets up a DSNL'amministratore dell'origine dati ODBC di Windows configura un DSN
Premi configura e aggiungi alcuni campi; Penso che questi possano essere tutti sovrascritti tramite una stringa di connessione in un secondo momento. Il mio VirtualBox, la rete e il server non sono contenti di closet.local per il nome del server, quindi viene utilizzato l'IP puntato. È possibile inserire l'utente e la password e testare la connessione e vedere i nomi dei database disponibili. Il JSL di seguito sovrascriverà quelli.
The ODBC Connector dialog supplies some information that can be overridden laterLa finestra di dialogo Connettore ODBC fornisce alcune informazioni che possono essere sovrascritte in seguito
Scopri i nomi dei tavoli nei database di MythTV
Grazie ad un esempio di @briancorcoran per aver indicato la strada con il prossimo bit di JSL.
https://community.jmp.com/t5/Discussions/How-do-I-get-the-list-of-the-databases-available-on-a-designated/mp/10589
// DSN=Mythtv comes from the windows ODBC Data Source Administrator applet
dt = Open Database(
"DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1],
"SHOW tables from " || dtConfig:DatabaseName[1] || ";",
"tables in " || dtConfig:DatabaseName[1]
);
Quel JSL sta usando la tabella di dati JMP dtConfig aperta dal file di configurazione XML, sopra, per ottenere la password effettiva e altre informazioni per sovrascrivere il DSN (che è anche chiamato mythtv, non correlato al nome utente). L'esempio di Brian ha usato SHOW DATABASES. Questo JSL utilizza SHOW TABLES FROM mythconverg per ottenere le oltre 80 tabelle dal database mythtv denominato mythconverg.
(SQL può avere più database e un database può avere più tabelle. I database non interagiscono tra loro, ma le tabelle all'interno di un database hanno spesso chiavi in comune che consentono di unire due tabelle. Quindi, un database per gli animali domestici, un database per le ricette e un database per MythTV. All'interno del database MythTV, tabelle che descrivono quali programmi registrare e tabelle che descrivono quali programmi sono stati registrati e molte altre tabelle...)
A JMP data table from Open Database(...) showing the 88 table names in the databaseUna tabella di dati JMP da Open Database(...) che mostra gli 88 nomi di tabella nel database
iniziare a decifrare la forma del database
Se lo fai in modo sbagliato E scrivi nel database, danneggerai il database. Potresti andare a leggere il codice sorgente per MythTV e magari trovare anche un documento che spieghi come funzionano i tavoli, oppure puoi porre la domanda entusiasmante: domani potrò ancora guardare la TV registrata? Quello che segue è il modo eccitante.
Guarda i nomi delle tabelle del database nella tabella dei dati sopra e vedi se ce ne sono di interessanti. Ci sono, ma non è ancora chiaro cosa rappresentino.
two of the high lighted table names, record and recorded, look promisingdue dei nomi dei tavoli in evidenza, record e registrato, sembrano promettenti
Ecco un modo semplice per sbirciare le tabelle e le loro colonne e un po' dei loro dati.
File→Database→OpenTable
The OpenTable dialog opens one database table into a JMP data tableLa finestra di dialogo Apri tabella apre una tabella di database in una tabella di dati JMP
Ci sono 50 colonne in questa tabella, ma quella che salta fuori è la descrizione:
The record table seems to describe what to recordLa tabella dei record sembra descrivere cosa registrare
Che è una descrizione di cosa registrare (o forse cosa non registrare... ho scritto quella regola). Questa non è la tabella di cui ho bisogno.
E la tabella denominata registrata?
The recorded table seems to be a list of programs that were recordedLa tabella registrata sembra essere un elenco di programmi che sono stati registrati
Sembra una tabella di programmi registrati. Questo sarà un punto di partenza.
Unisciti ad alcuni tavoli per ottenere tutto il necessario in un unico posto
File→Database→Generatore di query, seleziona la tabella registrata...
Query Builder starts by choosing a single tableQuery Builder inizia scegliendo una singola tabella
Quando premi NEXT otterrai questo fantastico @Eric_Hill finestra intermedia:
The amazing Select Tables windows can view other tables and join them to the first tableLe straordinarie finestre Seleziona tavoli possono visualizzare altri tavoli e unirli al primo tavolo
Questa finestra serve per esplorare le tabelle. Non fare ancora clic su Crea query, verrai indirizzato a una finestra in cui selezionerai le colonne. Prima di ciò, usa questa finestra per unirti ad altri tavoli.
(Puoi tornare in questa finestra più tardi, ma dovresti essere in grado di trovare tutto ciò di cui hai bisogno in seguito durante la tua prima visita... forse.)
Clicking a table shows a snapshotFacendo clic su una tabella viene visualizzata un'istantanea
Ecco cosa ho finito per usare (quasi, vedi sotto per un'altra modifica):
Three more tables joined with the firstAltri tre tavoli si unirono al primo
Ho usato il file registrato (selezionato sopra) per ottenere la dimensione del file che il database ricorda. Penso che questo database non sia normalizzato perché il nome di base appare nel file registrato e registrato ... https://en.wikipedia.org/wiki/Database_normalization
(I pulsanti in basso sono diversi perché ho usato il pulsante triangolo rosso torna-seleziona-più-tabelle in Crea query per ottenere questa immagine... premendo OK si tornerà alla finestra Crea query.)
C'è molto potere qui: puoi controllare il join con il pulsante del cerchio blu, puoi vedere un'istantanea di qualsiasi tabella nella colonna e puoi visualizzare in anteprima il risultato del join. E tutti i tavoli sono elencati! È qui che il puzzle viene risolto: quali tavoli sono necessari e come sono collegati tra loro. Seleziona la scheda Istantanea tabella, seleziona una tabella nella colonna di sinistra e utilizza la freccia rivolta verso il basso per visualizzare ciascuna tabella. Molti tavoli di MythTV sono vuoti, il che significa che posso ignorarli.
Seleziona le colonne da conservare
È ora di fare clic sul pulsante Crea query. Questa finestra ti consente di scegliere le colonne che desideri e provare la query:
Build Query window chooses columns to keep in the JMP data tableLa finestra Crea query sceglie le colonne da conservare nella tabella dati JMP
Quel pulsante doppia X elimina tutte le selezioni di colonna; probabilmente vorrai fare clic sulla singola X per eliminare solo la colonna selezionata. Sposta le righe che descrivono le colonne su e giù per ordinare le colonne e seleziona una colonna per preordinare i dati.
scegli Esegui query, studia la tabella, ripensa...
dalla finestra di dialogo sopra, il triangolo rosso accanto a Tabelle ti riporterà alla finestra di dialogo aggiungi un'altra tabella (quella fantastica). Avevo bisogno di un altro tavolo per capire davvero cosa stava succedendo.
Added another table, recgroupAggiunta un'altra tabella, recgroup
La tabella recgroups ha l'indicatore Gruppo eliminato. Ecco un po' del risultato (simile alla tabella originale in alto). Tutti questi nomi base si trovano nel gruppo predefinito, non nel gruppo eliminato.
The filesize column suggests there is a lot of space I might recoverLa colonna della dimensione del file suggerisce che c'è molto spazio che potrei recuperare
Quanto spazio perso!
Ecco il JSL/SQL dallo script sorgente nella tabella. Cambia <<
New SQL Query(
Connection( "ODBC:DSN=mythtv;SERVER=192.168.0.39;UID=mythtv;DATABASE=mythconverg;PORT=3306;PWD=%_PWD_%;"
),
QueryName( "recorded" ),
Select(
Column( "callsign", "t3" ),
Column( "channum", "t3" ),
Column( "starttime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "endtime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column( "title", "t1" ),
Column( "description", "t1" ),
Column( "autoexpire", "t1" ),
Column( "preserve", "t1" ),
Column( "deletepending", "t1" ),
Column( "recgroup", "t4" ),
Column( "basename", "t2" ),
Column( "filesize", "t2" ),
Column( "width", "t2" ),
Column( "height", "t2" ),
Column( "fps", "t2" ),
Column( "videoprop", "t5" ),
Column( "subtitletypes", "t5" )
),
From(
Table( "recorded", Alias( "t1" ) ),
Table( "recgroups", Alias( "t4" ),
Join( Type( Left Outer ),
EQ( Column( "recgroupid", "t1" ), Column( "recgroupid", "t4" ) )
)
),
Table( "recordedprogram", Alias( "t5" ),
Join(
Type( Left Outer ),
EQ( Column( "chanid", "t1" ), Column( "chanid", "t5" ) ) &
EQ(
Column("starttime","t1",Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) ),
Column("starttime","t5",Numeric Format( "m/d/y h:m:s", "0", "NO", "" ) )
)
)
),
Table( "recordedfile", Alias( "t2" ),
Join( Type( Left Outer ),
EQ( Column( "recordedid", "t1" ), Column( "recordedid", "t2" ) )
)
),
Table( "channel", Alias( "t3" ),
Join( Type( Left Outer ),
EQ( Column( "chanid", "t1" ), Column( "chanid", "t3" ) )
)
)
),
Order By( Column( "starttime", "t1", Numeric Format( "m/d/y h:m:s", "0", "NO", "" ),
Order( "Ascending" ) )
)
) << Run;
Quindi devo fare un piccolo test: per un singolo file bloccato, tocca il database per riattivare la scadenza automatica e l'eliminazione in sospeso. E magari fermare e riavviare il backend. Quindi guarda e vedi se il file viene eliminato, qualche volta nelle prossime ore o giorni ... anche quella parte del comportamento di MythTV, l'eliminazione just-in-time, è fonte di confusione.
H mmm. Meglio andare piano. La dimensione totale del file nella banca dati È due volte più grande di il disco.Cancelliamo questo: 1171_20180321043700.ts
Innanzitutto, fai una query per trovarlo, utilizzando un filtro. Sto seguendo questa strada perché JMP può fare la maggior parte del lavoro per me in una GUI e non mi sento del tutto a mio agio a scrivere l'SQL senza un aiuto. Modificherò l'SQL dopo che JMP ha svolto la parte difficile per me.
Add a filter to select a single basename (file)Aggiungi un filtro per selezionare un singolo basename (file)
Carino! Il filtro ha aggiunto la clausola WHERE all'SQL ed è stata trovata esattamente una riga. Penso che sia giunto il momento di copiare l'SQL dal file Costruttore di query dialogo; è necessario aggiungere il file mythconverg. prima di ogni nome di tabella :
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
//https://community.jmp.com/t5/Discussions/How-do-I-get-the-list-of-the-databases-available-on-a-designated/m-p/10589
// dtConfig:UserName,Password,DatabaseName
//
// DSN=Mythtv comes from the windows ODBC Data Source Administrator applet
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
SELECT t3.callsign, t3.channum, t1.starttime, t1.endtime,
t1.title, t1.description, t1.autoexpire, t1.preserve,
t1.deletepending, t4.recgroup, t2.basename, t2.filesize,
t2.width, t2.height, t2.fps, t5.videoprop,
t5.subtitletypes
FROM mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
WHERE ( ( ( t2.basename="1171_20180321043700.ts" ) ) )
ORDER BY t1.starttime ASC;
]\","one row");
Close Database Connection(dbc);
close(dtConfig,nosave);
show(nrows(rc)==1); // better only be one row
ATTENZIONE, SEGUE UN CODICE PERICOLOSO, POTRESTI CANCELLARE IL TUO DATABASE CON UPDATE E SET.
e sostituisci SELEZIONA... DA con AGGIORNA e aggiungi una clausola SET e rimuovi ORDER BY:
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
UPDATE mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
SET t1.autoexpire=1, t1.deletepending=0
WHERE ( ( ( t2.basename="1171_20180321043700.ts" ) ) );
]\","update");
Close Database Connection(dbc);
close(dtConfig,nosave);
recuperare nuovamente la tabella mostra l'aggiornamento:
The UPDATE and SET workedUPDATE e SET hanno funzionato
Non sono sicuro di come ottenere lo stato dell'aggiornamento; rc era un valore mancante e non è stata creata alcuna tabella, il che ha senso. Ma ha funzionato...
Diversi minuti dopo, il file è ancora presente. Riavvierò il backend. Riavviato. Il file ora viene visualizzato nel frontend.
Part of the frontend GUI shows the ancient file is visible againParte della GUI del frontend mostra che il file antico è di nuovo visibile
Mi siedo e vedo se va via su disco in pochi giorni. Quindi lavorerò sul resto di quelli in questo modo e vedrò perché il database sembra pensare che ci siano 6T su un disco 3T ...
Poche ore dopo: ls: impossibile accedere a '1171_20180321043700.ts': file o directory non presenti
Come notato sopra (commento normalizzato), il nome del file appare in più di una tabella. Il mio piano per ripulire il 6T fino a un 3T più realistico presuppone che ci siano voci nella tabella registrata che si riferiscono a file che non sono più su disco. Piuttosto che provare a eliminare i record da entrambe le tabelle (e forse più?), Penso che creerò un file fittizio se non ce n'è uno e lascerò che il codice esistente lo gestisca nel solito modo. Forse un buon primo passo sarebbe semplicemente aprire le tabelle del database dei file registrati e dei file registrati nelle tabelle dei dati JMP e identificare dove ci sono file mancanti sul disco e incoerenti tra le tabelle.
File → Database → OpenTable lo farà. Elimina tutte le colonne tranne il nomebase e l'ID registrato, ordina per ID registrato, confronta i datatables. Tre differenze su cui fare clic. Facile.
Curioso: 1171_20180317233200.ts è nel file registrato, ma non registrato
ed esiste come file a 0 byte -rw-rw-r-- 1 mythtv mythtv 0 4 aprile 2018 1171_20180317233200.ts
E ci sono due voci con un nome tutto vuoto nel file registrato che non hanno un id registrato corrispondente in registrato. Probabilmente non voglio ripulirli, non si sa a quali altri tavoli potrebbero fare riferimento.
Il file cancellato sopra, 1171_20180321043700.ts , non compare in nessuna delle due tabelle. Sìì!
Userò registrato come verità poiché non ha i record vuoti. Userò una formula di colonna con la funzione fileexists() per aiutare a vedere cosa sta succedendo.
Graph; points at top represent real files on disk, points at bottom are files that are not on diskGrafico; i punti in alto rappresentano file reali su disco, i punti in basso sono file che non sono su disco
C'è qualche possibilità che riavrò molto spazio su disco, ma potrebbero esserci molti file di lunghezza zero o quasi zero in quel cluster che voglio eliminare. È ora di una pausa, non dovrebbe iniziare alle 21:00.
Per rispondere alla domanda "quanto?" domanda, usa filesize() piuttosto che fileexists(). Esistono molti file, ma sono zero byte, quindi c'è solo circa 0,3 T (10%!) Di spazio recuperabile.
Fase 1: aggiungi file fittizi per i file non esistenti in modo che MythTV possa ripulirli in seguito. Il motivo per cui i record rimangono nel database quando MythTV non riesce a trovare i file è perché MythTV presume che i file potrebbero trovarsi su un disco non disponibile e diventerebbero orfani se la voce del database fosse rimossa.
// actualsize is this formula:
// File Size( "f:/closet/" || :basename )
For Each Row(
If( :basename != "" & Is Missing( actualsize ),
If( !File Exists( "f:/closet/" || :basename ),
Show( :basename );
Save Text File( "f:/closet/" || :basename, "hi there" );// use “touch” on Linux
, // else
Throw( "oops" )
)
)
);
Write( "\!ndone" );
Fase 2: recupera una nuova copia del database in un datatable. Sembra buona. È ora di rielaborare l'SQL per vedere se possiamo selezionare solo i record da aggiornare:
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
SELECT t3.callsign, t3.channum, t1.starttime, t1.endtime,
t1.title, t1.description, t1.autoexpire, t1.preserve,
t1.deletepending, t4.recgroup, t2.basename, t2.filesize,
t2.width, t2.height, t2.fps, t5.videoprop,
t5.subtitletypes
FROM mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
WHERE ( ( ( t1.deletepending=1 ) ) )
ORDER BY t1.starttime ASC;
]\","one row");
Close Database Connection(dbc);
close(dtConfig,nosave);
show(nrows(rc)==1);
Questo seleziona circa la metà dei record, tutti piuttosto vecchi, che sono appesi con l'eliminazione in sospeso. È ora di osare...
Fase 3: fallo.
ATTENZIONE, SEGUE UN CODICE PERICOLOSO, POTRESTI CANCELLARE IL TUO DATABASE CON UPDATE E SET.
// grab user name and password from the XML config file
dtConfig = Open( "F:\mythconfig.xml", invisible, XML Wizard( 0, guess( "huge" ) ) );
dbc=CreateDatabaseConnection("DSN=Mythtv;UID=" || dtConfig:UserName[1] || ";PWD=" || dtConfig:Password[1]);
rc=executesql(dbc,"\[
UPDATE mythconverg.recorded t1
LEFT OUTER JOIN mythconverg.recgroups t4
ON ( t1.recgroupid = t4.recgroupid )
LEFT OUTER JOIN mythconverg.recordedprogram t5
ON ( ( t1.chanid = t5.chanid ) AND ( t1.starttime = t5.starttime ) )
LEFT OUTER JOIN mythconverg.recordedfile t2
ON ( t1.recordedid = t2.recordedid )
LEFT OUTER JOIN mythconverg.channel t3
ON ( t1.chanid = t3.chanid )
SET t1.autoexpire=1, t1.deletepending=0
WHERE ( ( ( t1.deletepending=1 ) ) );
]\","update");
Close Database Connection(dbc);
close(dtConfig,nosave);
I deletependings non sono più in sospeso e la scadenza automatica è di nuovo attiva. È ora di aspettare e vedere.
La mattina dopo: penso che funzioni; avrebbe dovuto prendere appunti migliori. Ecco i file più vecchi ancora in giro prima che vengano registrati i notiziari mattutini (6:50 di lunedì):
-rw-r--r-- 1 mythtv mythtv 1.9G Mar 22 2018 1111_20180322080000.ts
-rw-r--r-- 1 mythtv mythtv 3.2G Mar 22 2018 1051_20180322080000.ts
-rw-rw-rw- 1 mythtv mythtv 1.1M Mar 22 2018 1111_20180322043700.ts.png
-rw-r--r-- 1 mythtv mythtv 11G Mar 22 2018 1171_20180322060700.ts
-rw-r--r-- 1 mythtv mythtv 5.6G Mar 22 2018 1111_20180322063000.ts
-rw-rw-rw- 1 mythtv mythtv 1.4M Mar 22 2018 1051_20180322033500.ts.png
-rw-r--r-- 1 mythtv mythtv 3.2G Mar 22 2018 1051_20180322070000.ts
-rw-r--r-- 1 mythtv mythtv 5.7G Mar 22 2018 1051_20180322060700.ts
-rw-r--r-- 1 mythtv mythtv 3.2G Mar 22 2018 1051_20180322053700.ts
-rw-r--r-- 1 mythtv mythtv 1.6G Mar 22 2018 1111_20180322053700.ts
-rw-r--r-- 1 mythtv mythtv 6.4G Mar 22 2018 1051_20180322043700.ts
-rw-r--r-- 1 mythtv mythtv 5.4G Mar 22 2018 1171_20180322043700.ts
-rw-rw-rw- 1 mythtv mythtv 1.4M Mar 22 2018 1171_20180322030000.ts.png
-rw-rw-rw- 1 mythtv mythtv 3.4M Mar 22 2018 1051_20180322030100.ts.png
-rw-r--r-- 1 mythtv mythtv 2.1G Mar 22 2018 1111_20180322043700.ts
-rw-rw-rw- 1 mythtv mythtv 511K 22 marzo 2018 1111_20180322030000.ts.png
-rw-r--r-- 1 mythtv mythtv 6.6G Mar 22 2018 1051_20180322033500.ts
-rw-r--r-- 1 mythtv mythtv 3.8G Mar 22 2018 1111_20180322033500.ts
-rw-r--r-- 1 mythtv mythtv 3.3G Mar 21 2018 1171_20180322030000.ts
-rw-r--r-- 1 mythtv mythtv 3.7G Mar 21 2018 1051_20180322030100.ts
-rw-r--r-- 1 mythtv mythtv 2.4G Mar 21 2018 1111_20180322030000.ts
-rw-r--r-- 1 mythtv mythtv 3.3G Mar 21 2018 1051_20180321233000.ts
-rw-rw-rw- 1 mythtv mythtv 725K Mar 21 2018 1111_20180321200000.ts.png
-rw-rw-rw- 1 mythtv mythtv 2.6M Mar 21 2018 1051_20180321200000.ts.png
-rw-r--r-- 1 mythtv mythtv 2.9G Mar 21 2018 1051_20180321200000.ts
-rw-r--r-- 1 mythtv mythtv 1.8G Mar 21 2018 1111_20180321200000.ts
-rw-rw-rw- 1 mythtv mythtv 897K Mar 21 2018 1111_20180321163000.ts.png
-rw-r--r-- 1 mythtv mythtv 3.2G Mar 21 2018 1051_20180321163000.ts
-rw-r--r-- 1 mythtv mythtv 2.0G Mar 21 2018 1111_20180321163000.ts
-rw-r--r-- 1 mythtv mythtv 2.0G Mar 21 2018 1111_20180321160000.ts
-rw-r--r-- 1 mythtv mythtv 102M Mar 21 2018 1171_20180321160000.ts
-rw-r--r-- 1 mythtv mythtv 26G Mar 21 2018 1051_20180321110000.ts
-rw-r--r-- 1 mythtv mythtv 8.1G Mar 21 2018 1111_20180321110000.ts
-rw-r--r-- 1 mythtv mythtv 3.3G Mar 21 2018 1171_20180321100000.ts
-rw-r--r-- 1 mythtv mythtv 6.2G Mar 21 2018 1051_20180321100000.ts
-rw-r--r-- 1 mythtv mythtv 3.9G Mar 21 2018 1111_20180321100000.ts
-rw-rw-rw- 1 mythtv mythtv 743K Mar 20 2018 1281_20180321010000.ts.png
-rw-rw-rw- 1 mythtv mythtv 867K Mar 20 2018 1281_20180321002000.ts.png
drwxr-xr-x 12 root root 4.0K 20 marzo 2018 ..
drwx------ 2 root root 16K Feb 28 2018 perso+trovato
Programs recorded Friday will be recorded again today (Monday)I programmi registrati venerdì verranno registrati di nuovo oggi (lunedì)
Quei tre programmi hanno utilizzato circa 40 GB lo scorso venerdì. Alle 9:30, gli ultimi 13.4G nella tabella registrata sono stati cancellati. Non sono sicuro da dove provenga l'altro 15G. Forse la coda di eliminazione conteneva già alcuni file. Forse questi sono stati aggiunti nel primo ordine più vecchio, dopo alcuni altri... Cerco di non registrare la TV durante il giorno, quindi potrebbe essere stasera prima che vengano eliminati altri file. (Sì, sta succedendo!) Spero che anche le miniature png (giganti) si prendano cura di se stesse, troppo presto per dirlo.
Quello che ho imparato su JMP e SQL: c'è un modo davvero semplice per caricare una tabella SQL in una tabella dati JMP se non è necessaria alcuna unione (File→Database→Apri tabella). essere uniti (File → Database → Generatore di query). Entrambi generano anche uno script JSL nella tabella che può essere riutilizzato. E, se hai bisogno di aggiornare il database, dovrai usare la funzione ExecueSQL(), ma puoi fare in modo che Query Builder crei l'SQL che è quasi ciò di cui hai bisogno, quindi cambialo e fai un UPDATE/SET.
In passato ho svolto parte del lavoro SQL al di fuori di JMP. Ho trovato davvero bello usare JSL per fare del lavoro non SQL (creazione di file fittizi, creazione di grafici sull'utilizzo del disco) che mi ha aiutato a capire meglio il database.
https://code.mythtv.org/cgit/mythtv/tree/mythtv/programs/mythbackend/autoexpire.cpp punto di partenza per il codice sorgente di MythTV relativo alla pulizia di vecchi file
https://en.wikipedia.org/wiki/Taglio-cordone
Sembra che tutto sia tornato alla normalità. Questo grafico finale mostra come diverse stazioni hanno ottimizzato la loro larghezza di banda disponibile. La larghezza di banda può essere suddivisa in uno o più canali; più canali riduce significa meno dati per fare un'immagine di alta qualità. Una delle stazioni locali ha anche scelto di andare con 720 60FPS piuttosto che 1080 30FPS, il che significa che forse non è un confronto tra mele e mele. Ciascuno dei canali evidenziati ha probabilmente uno o più altri canali della stessa stazione con cui condivide la larghezza di banda. Le stazioni in grigio in basso potrebbero trasmettere più vecchi film contemporaneamente o canali di acquisto. Sono stati rimossi dalla leggenda.
Lines with bigger slope have more bandwidth allocated to the pictureLe linee con pendenza maggiore hanno più larghezza di banda assegnata all'immagine