PDA

View Full Version : [Vari] Contest 19: Full Text Search(e non solo).


Pagine : [1] 2 3 4 5

Vincenzo1968
13-01-2013, 12:57
Scaricate i file di input da qui:

https://github.com/hwupgradecontest/contest19/tree/master/All

Si tratta di una serie di opere letterarie che ho preso da qui:

http://www.liberliber.it/

Grazie a Msangi e The_Ouroboros, il link su github dove potete mettere i vostri sorgenti:
https://github.com/hwupgradecontest/contest19

Per aggiungere il proprio codice du github:

The_Ouroboros:
http://www.hwupgrade.it/forum/showpost.php?p=39006747&postcount=784

Vicius:
https://github.com/hwupgradecontest/README

;)

Punto A:
Il programma dovrà leggere i file .txt fondendoli e creandone uno solo delle dimensioni specificate dall'utente. Il file di output sarà poi utilizzato per il Punto B: algoritmi di Full Text Seach (http://en.wikipedia.org/wiki/Full_text_search).
La fusione dei vari file txt va effettuata prendendo le singole righe di ogni file di input e mescolandole, in modo casuale, con quelle di tutti gli altri file.
Vanno escluse, nel file di output, le righe vuote. Vanno inoltre eliminati gli spazi superflui. Due o più spazi consecutivi andranno sostituiti con uno spazio solo. Le tabulazioni vanno sostituite con uno spazio.
Per il punto B utilizzeremo il programma che si rivelerà il migliore dal punto di vista delle prestazioni ma soprattutto dalla qualità dell'output.
Il programma, CUI o GUI, a vostra scelta, dovrà dunque permettere all'utente di specificare il nome del file di output e la dimensione. Nel caso l'utente scelga una dimensione maggiore di quella del totale dei file di input, si ricominci dal primo file e via via con tutti gli altri, mescolando sempre in modo casuale le righe.

Esempio(CUI):
http://img715.imageshack.us/img715/2317/c19gen.jpg

Punto B:
Da definire più in la. Ci occuperemo degli algoritmi per la Full Text Seach (http://en.wikipedia.org/wiki/Full_text_search) e confronteremo le prestazioni(e la qualità dei risultati) con alcuni programmi che vanno per la maggiore nel settore: Lucene (http://lucene.apache.org/), Zettair (http://www.seg.rmit.edu.au/zettair/index.html), Indri (http://www.lemurproject.org/indri.php).
Punto B.1:

B.1:
Si realizzi un programmino che, data in input una stringa di ricerca, indichi l'esatta posizione (riga e colonna) nel file creato al punto A.

Si prendano separatamente i tempi per la creazione dell'indice e quelli per la ricerca.

Se volete utilizzare un algoritmo brute force, senza creare l'indice, siete liberi di farlo.


L'esempio qui: http://www.hwupgrade.it/forum/showpost.php?p=38906339&postcount=180


Punto B.2:

Si scriva un programmino simile a quello presente nella distribuzioni Linux per contare i caratteri, le parole, le righe, la riga più lunga e la parola più lunga(quest'ultima cosa il comando wc non la fa):


http://img33.imageshack.us/img33/3691/c19b02wc.jpg

Le parole dovranno essere parole di senso compiuto. "---------" o "........" o "£$%*/*&&&" non sono parole di senso compiuto.
"parola", "ciao", "hello" invece si, sono parole di senso compiuto. ;)
Si veda, inoltre, questo post(grazie a msangi): http://www.hwupgrade.it/forum/showpost.php?p=38985909&postcount=618.
E questo(grazie a clockover): http://www.hwupgrade.it/forum/showpost.php?p=38990890&postcount=645

Punto B.3
Si modifichi il programmino di cui al punto B.2 in modo da fargli accettare due argomenti dalla riga di comando(oltre al nome del file):

1) Il parametro "-L=d" dove d sta per la dimensione minima delle parole che l'utente desidera per il conteggio. Per esempio, -L=5 significa che l'utente desidera che vengano conteggiate le parole con lunghezza >= 5.

2) Il parametro "-F=file" dove file sta per il nome di un file specificato dall'utente dove sono listati, una parola per riga, le parole che l'utente desidera escludere dalla ricerca. Per esempio:

il
lo
la
i
gli
le

Col suddetto file passato come argomento, il programmino dovrà escludere dal conteggio le parole "il", "lo", "la", "i", "gli", "le".

------------------------------------------------------------------------------------------------------------------------------------------------------

E, a cura dell'utente Marco.r:
Punto C:
Catene Markoviane. In preparazione.
;)

Vincenzo1968
13-01-2013, 13:29
Per esempio, se abbiamo questi file in input:

File 1:

file 1 riga 1
file 1 riga 2
file 1 riga 3


File 2:

file 2 riga 1

file 2 riga 2
file 2 riga 3


File 3:

file 3 riga 1
file 3 riga 2
file 3 riga 3


Il file risultante dovrà essere, per esempio, così:

file 3 riga 2
file 2 riga 2
file 3 riga 1
file 3 riga 3
file 1 riga 3
file 1 riga 1
file 2 riga 3
file 2 riga 1
file 1 riga 2


Come vedete, nel file di output, sono stati eliminati gli spazi superflui e le righe vuote.
Le righe debbono risultare disposte in modo casuale. Una nuova esecuzione del programma darà, ovvviamente, una nuova disposizione delle righe.

Per esempio:

file 3 riga 1
file 1 riga 3
file 3 riga 3
file 1 riga 2
file 2 riga 2
file 1 riga 1
file 2 riga 3
file 3 riga 2
file 2 riga 1

Vincenzo1968
13-01-2013, 13:51
Dall'incipit del Cap. IV de I Promessi Sposi di Alessandro Manzoni:


Il sole non era ancor tutto apparso sull'orizzonte, quando il padre Cristoforo uscì dal suo convento di Pescarenico, per salire alla casetta dov'era aspettato.


Dall'incipit del Cap. VIII di Quer pasticiaccio brutto de via Merulana di Carlo Emilio Gadda:

Il sole non aveva ancora la minima intenzione di apparire all'orizzonte che già il brigadiere Pestalozzi usciva(in motocicletta) dalla caserma degli erre erre ci ci di Marino per catapultarsi alla bottega-laboratorio dove non era minimamente aspettato, almeno in quanto brigadiere fungente.


:D

AnonimoVeneziano
14-01-2013, 09:29
Leggendo il contest una cosa non mi è chiara.

Dici che il programma deve mischiare insieme le righe dei due file in ordine casuale, ma nell'esempio mescoli i file anche partendo da metà di quella che io considererei una riga (un qualcosa che va da newline a newline), quindi vorrei capire: qual'è la tua idea di riga in questo caso?

Ciao

EDIT: Un altra cosa che non ho capito bene è cosa succede quando l'output è maggiore dell'input. Cosa intendi per "si ricomincia dal primo file" ? Intendi che riscrive il testo in ordine dal primo file in poi o intendi che si resetta il mescolamento e si riparte a mescolare i file?

Tommo
14-01-2013, 15:54
Vi anticipo già 50 ms per un file da 2 mb :D

Ero partito usando C++11 e la stl eccetera, e per quanto sia diventata parecchio veloce in sè mi forzava a copiare la memoria in giro... sotto 500 ms non si scendeva.
Il buon vecchio C è ancora imbattuto :D

EDIT: ok, 43 ms e sto, almeno sul mio SSD.
Un'esecuzione usa ~40 ms per fopen/fread, ~2 ms per fare il parsing dei file e ~0.1 ms per scrivere l'output (questo grazie allo SSD che è una bestia :D ), probabilmente nel caso dello SSD sarebbe molto più veloce leggendo tutti i file in parallelo, ma d'altra parte nel caso di un HDD meccanico sarebbe molto peggio, e vincerebbe alla grande accorpare tutti i files in un file solo per minimizzare il seek time.

Odio un pò sti problemi che esce Vincenzo1968 perchè finiscono sempre a fare a botte con l'HD :asd:

AnonimoVeneziano
14-01-2013, 16:18
Vi anticipo già 50 ms per un file da 2 mb :D

Ero partito usando C++11 e la stl eccetera, e per quanto sia diventata parecchio veloce in sè mi forzava a copiare la memoria in giro... sotto 500 ms non si scendeva.
Il buon vecchio C è ancora imbattuto :D

Non puoi sperare di usare la STL e di andare veloce ... :asd:

Tommo
14-01-2013, 16:22
Non puoi sperare di usare la STL e di andare veloce ... :asd:

In realtà il problema era che non esiste un modo per assegnare memoria preesistente a std::string, e quindi non avrei potuto usare il "trucco" che ha tagliato di 10 volte il tempo...
ma come dicevo, a pari algoritmo non sono più lente di C, e di sicuro il codice esce molto più bello a vedersi (e la condivisione di memoria che ho usato è come chiedere bug a manetta :D)

EDIT: ecco il codice

main.cpp (http://pastebin.com/Yd0MR2rj)

LineBuffer.h (http://pastebin.com/2QNDBA3F)

common_header.h (http://pastebin.com/f18ACYwH)

EDIT2: ho provato a farlo girare su un disco in rete (lag come se piovesse, 13 mb/s max) e come previsto ci mette quasi 1.6 secondi... un dettaglio interessante però è che già alla 3a run ci metteva solo 66 ms, il che prova che Windows è abbastanza furbo da mettere in cache i file usati di recente sul disco più veloce :D

AnonimoVeneziano
14-01-2013, 16:44
Se qualcuno avesse avuto gli stessi dubbi riguardo al testo del contest queste sono state le risposte di Vincenzo alle mie domande:


Quando l'output è maggiore dell'input si riparte dall'inizio. Si prendono tutti i file e si ricomincia a mescolare le righe(di tutti i file) fino a quando il file di output non raggiunge la dimensione voluta.
Non ho capito bene la prima domanda. Considera che nell'esempio ho mescolato le righe a mano; il programma lo devo ancora finire.

T'ho scritto in privato perché m'hanno sospeso e non posso postare nel thread. Potresti cortesemente postare tu la mia risposta?
Al limite specifica che te l'ho chiesto io tramite pm.



A quel punto ho riformulato la mia prima domanda e lui ha risposto che si , bisogna identificare ogni riga e mescolarle insieme (le righe vanno da newline a newline)

The_ouroboros
16-01-2013, 14:53
Comunicazione di servizio da Vincenzo1968:

http://classes.soe.ucsc.edu/ism293/Spring09/material/bootcamp_3_Lemur.pdf

http://ciir.cs.umass.edu/~strohman/indri/

http://www.lemurproject.org/lemur/IndriQueryLanguage.php

http://myweb.uiowa.edu/cgharris/images/indri.pdf

Serviranno per il punto B.

VICIUS
17-01-2013, 10:07
Questa la mia versione in Java: Generate.java (http://cl.ly/MERN).

A leggere tutti i file da disco ci mette circa 800ms. Per creare un file di 5 gb ci impiega poco più di 4 minuti.

➜ Contest time java contest.Generate file -D5GiB
java contest.Generate file -D5GiB 78.23s user 159.79s system 98% cpu 4:01.87 total

Non ho potuto provare la versione di tommo perché stdafx.h cozza un po' con osx e linux. Fare un confronto sullo stesso hardware sarebbe interessante ma non credo che ci sia una grande differenza tra i due. Una vota passato una certa dimensione il limite dovrebbe essere il disco.

Si potrebbe passare a nio per evitare di scopiazzare stringhe qua e là. Eliminare la regex e ripulirsi a mano il testo. Ed usare un executor per distribuire il lavoro tra i vari core. Ma non credo ne valga la pena.

Vincenzo1968
17-01-2013, 10:22
Ragazzi, una cortesia:

per facilitare il compito agli utenti che volessere provare i programmi postati(e soprattutto a me che devo scaricare i sorgenti di tutti e stilare le classifiche), bisognerebbe zippare i sorgenti e metterli su un sito di file sharing.

Ce ne sono un fottìo. Uno dei miei preferiti è:

http://www.filedropper.com/

Non richiede iscrizione e soprattutto, quando uno clicca sul link per scaricare il file, non bisogna aspettare i maledetti trenta secondi di pubblicità(c'è solo da inserire 4 caratteri per il riconoscimento umano).

Edit: Ho visto ora che nel link di Vicius c'è il link diretto che permette di scaricare il file compresso. Ma, se il programma è composto da più file sorgenti?

Vincenzo1968
17-01-2013, 10:30
Questa la mia versione in Java: Generate.java (http://cl.ly/MERN).

A leggere tutti i file da disco ci mette circa 800ms. Per creare un file di 5 gb ci impiega poco più di 4 minuti.

➜ Contest time java contest.Generate file -D5GiB
java contest.Generate file -D5GiB 78.23s user 159.79s system 98% cpu 4:01.87 total

Non ho potuto provare la versione di tommo perché stdafx.h cozza un po' con osx e linux. Fare un confronto sullo stesso hardware sarebbe interessante ma non credo che ci sia una grande differenza tra i due. Una vota passato una certa dimensione il limite dovrebbe essere il disco.

Si potrebbe passare a nio per evitare di scopiazzare stringhe qua e là. Eliminare la regex e ripulirsi a mano il testo. Ed usare un executor per distribuire il lavoro tra i vari core. Ma non credo ne valga la pena.

Io sono riuscito a compilare la versione di Tommo su Linux ma ho dovuto togliere i file afx e inserire manualmente gli include.

Quindi ragazzuoli, quando utilizzate Visual Studio, create un progetto vuoto altrimenti vengono inseriti gli afx e poi li debbo modificare a mano(per compilarli su Linux). A meno che non decidiate che la vostra versione debba girare solo su Windows.

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Comunque il file prodotto dalla versione di Tommo ha qualche problemino(lascia qualche riga vuota e qualche spazio superfluo). Lo sta sistemando.

Vincenzo1968
17-01-2013, 10:55
http://img405.imageshack.us/img405/3176/viciuserrror.jpg

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Vincenzo1968
17-01-2013, 11:17
Ah dimenticavo: il tempo dev'essere espresso in secondi.

Quindi non

825 ms


ma

0.825 secondi

"secondi" scritto per esteso, non abbreviato "s.".

;)

VICIUS
17-01-2013, 11:33
http://img405.imageshack.us/img405/3176/viciuserrror.jpg

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

I package di java proprio non ti entrano in testa :asd:. I file .class devono stare nella cartella contest. Devi lanciarlo da fuori dando il nome completo contest.Generate.

Vincenzo1968
17-01-2013, 12:44
I package di java proprio non ti entrano in testa :asd:. I file .class devono stare nella cartella contest. Devi lanciarlo da fuori dando il nome completo contest.Generate.

http://img607.imageshack.us/img607/3078/viciuserror2.jpg

http://www.hwupgrade.org/public/style_emoticons/default/rage.png http://www.hwupgrade.org/public/style_emoticons/default/rage.png http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Vincenzo1968
17-01-2013, 12:52
Spiegatemi una cosa. Le funzioni per la gestione dei file in C a 64 bit sono standard(e quindi posso tranquillamente compilare e in Windows e in Linux)?

Per esempio, la funzione "_ftelli64" è standard o è specifica del compilatore Microsoft?

VICIUS
17-01-2013, 12:56
Quando hai compilato i sorgenti ti deve aver creato due file class. Il primo è Generate.class che è il programma principale. E poi c'è anche un Generate$1.class che è la classe anonima creata per TXT_FILES.

Vincenzo1968
17-01-2013, 13:26
http://img17.imageshack.us/img17/712/c19gcc.jpg

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Non è standard. Mo debbo arrangiarmi con le macro per la compilazione condizionale.

Che debbo usare per GCC/Linux?

Vincenzo1968
17-01-2013, 13:28
Quando hai compilato i sorgenti ti deve aver creato due file class. Il primo è Generate.class che è il programma principale. E poi c'è anche un Generate$1.class che è la classe anonima creata per TXT_FILES.

Ok. Se non funziona nemmeno così le urla le sentirete fin lassù al nord.

Vincenzo1968
17-01-2013, 13:38
Funziona, il file viene creato:

http://img825.imageshack.us/img825/3604/c19outputvicius.jpg

Ma i tempi dove sono? Me li devo calcolare col cronometro?

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

The_ouroboros
17-01-2013, 13:42
anteponici un time prima :D

Vincenzo1968
17-01-2013, 13:48
anteponici un time prima :D

Eh si, non solo devo scaricare i file di tutti quanti, compilarli, fare gli screenshot e stilare le classifiche. Debbo pure mettermi a modificare i sorgenti? Follia pura.

:D

The_ouroboros
17-01-2013, 13:56
prima di eseguire il comando nella cli intendevo :fagiano:

Vincenzo1968
17-01-2013, 13:56
Verificato il file in output di Vicius: è tutto a posto. Vengono eliminati gli spazi superflui e le righe vuote. Anche l'algoritmo per la randomizzazione delle righe è corretto. Rigenerando il file una seconda volta le righe vengono dispose in maniere diversa.

Bravo Vicius, ma stampa i tempi a video e posta i nuovi sorgenti ;)

Tommo
17-01-2013, 14:17
stdafx.h non è specifico Microsoft, si chiama precompiled header e per quanto mi riguarda non usarlo è peccato in sè :D
VC semmai fino a poco fa era l'unico IDE sano che te lo creava di default, ma per fortuna ora anche XCode si è adeguato... l'unico sistema con cui ancora fa a botte è make, ma make fa ovviamente schifo.

Comunque basta rimuovere l'include e compila allegramente, solo (teoricamente) più lento.

Inoltre mi permetto pacatamente di dissentire dall'affermazione che un qualsiasi programma Java possa andare vagamente veloce uguale :D

The_ouroboros
17-01-2013, 14:21
l'unico sistema con cui ancora fa a botte è make, ma make fa ovviamente schifo.


l'importante è avere una propria opinione ;)

Tommo
17-01-2013, 14:32
l'importante è avere una propria opinione ;)

Quando riuscirà a compilarmi un progetto di medie dimensioni con precompiled header senza toppare e rebuildarlo daccapo 50% delle volte cambierò la mia :D
C'ho combattuto ore, non c'è stato niente da fare... costruisce il pch e lo mette nella dir giusta... ma non lo usa, e non posso che concludere che è pessimo :asd:
Senza contare che apri uno script e guardalo, e dimmi se una persona sana di mente scriverebbe una cosa del genere :asd:

The_ouroboros
17-01-2013, 14:51
Quando riuscirà a compilarmi un progetto di medie dimensioni con precompiled header senza toppare e rebuildarlo daccapo 50% delle volte cambierò la mia :D


compila kernel linux e molti altri progetti.
Direi che è abbastanza per me :D

Tommo
17-01-2013, 15:25
compila kernel linux e molti altri progetti.
Direi che è abbastanza per me :D

Aoh, contento te :asd:
Per me un build system che mi allunga i build time da 2 minuti a una media di 10 non si può nemmeno considerare professionale.
Poi se a te piace vedere il pc che scrive le cose nella console mentre compila il kernel, sono opinioni :D

VICIUS
17-01-2013, 15:25
Inoltre mi permetto pacatamente di dissentire dall'affermazione che un qualsiasi programma Java possa andare vagamente veloce uguale :D
Si tratta di fare i/o su disco. Basta usare un buffer quando scrivi ed usare l'opzione -server. Due cose che non avevo fatto ma ci vuole un attimo ad aggiungerle.

Sul mio trabicolo
➜ Contest time java -server contest.Generate file -D5GiB
java -server contest.Generate file -D5GiB 41.51s user 7.11s system 53% cpu 1:31.39 total
➜ Contest time ./Tommo file -D5GB
./Tommo file -D5GB 12.45s user 16.99s system 33% cpu 1:28.61 total

3 secondi di differenza sono pochissimi. Se ci aggiungici un po' di varianza perché stavo facendo anche altro allora i due valori sono praticamente identici.

Vincenzo1968
17-01-2013, 15:42
http://img401.imageshack.us/img401/377/tempipuntoa.jpg

Il programma di Vicius ci mette 2 minuti e 5 secondi.

Su questa macchina:
http://img7.imageshack.us/img7/5461/macchinae.jpg

Tommo
17-01-2013, 15:45
Vero, stavo trollando comunque :D

EDIT: ma il post appena sopra mi da ragione :asd:

Vincenzo1968
17-01-2013, 15:56
Per il momento posto solamente l'eseguibile a 32 bit per Windows:

http://www.filedropper.com/c19a

Più tardi(o domani) posto anche la versione a 64 bit(e gli eseguibili per Linux e il sorgente).

L'applicazione è compilata con Visual Studio 2010. Se avete un sistema operativo vecchio potrebbe essere necessario installare le dll runtime di Visual Studio. Potete scaricarle gratuitamente da qui:

http://www.microsoft.com/it-it/download/details.aspx?id=5555

;)

Vincenzo1968
17-01-2013, 15:57
@Tommo: hai apportato le modifiche ai sorgenti? quando posti la versione corretta?

@Vicius: 'mbé? La stampa dei tempi a video? In secondi non in millisecondi. Quando posti la nuova versione?:mbe:

:D

VICIUS
17-01-2013, 15:58
Vero, stavo trollando comunque :D

EDIT: ma il post appena sopra mi da ragione :asd:

I bench di vincenzo non contano. In sicilia java gira più lentamente. :O

VICIUS
17-01-2013, 15:59
@Vicius: 'mbé? La stampa dei tempi a video? In secondi non in millisecondi. Quando posti la nuova versione?:mbe:

:D
Non serve modificare il codice. Usa time come ti è stato detto. ;)

Vincenzo1968
17-01-2013, 16:07
Non serve modificare il codice. Usa time come ti è stato detto. ;)

No, così non può essere. Uso Time? E come lo uso time?

Non posso impazzire a modificare i sorgenti(Java lo conosco poco e niente). Probabilmente sarà una cazzata ma devo andarmi a leggere la documentazione. Follia pura!

È obbligatorio stampare il tempo in secondi a video. Altrimenti sambenito per un mese intero.

:D

Sbrigatevi(tu e Tommo) che entro stasera vedo di stilare una classifica(provvisoria).

The_ouroboros
17-01-2013, 16:27
Scrivi time prima di invocare java...

Inviato dal mio HUAWEI U8825-1 con Tapatalk 2

VICIUS
17-01-2013, 16:33
time è un comando di linux :muro:

Sei fortunato che ho 5 minuti mentre fa il deploy. "Nuova" versione http://cl.ly/MEjp.

Ricordati di usare l'opzione -server di java

Vincenzo1968
17-01-2013, 16:33
L'applicazione compilata con GCC a 64 bit:
http://img203.imageshack.us/img203/7105/tempilinux.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
17-01-2013, 16:36
time è un comando di linux :muro:

Sei fortunato che ho 5 minuti mentre fa il deploy. "Nuova" versione http://cl.ly/MEjp.

Ricordati di usare l'opzione -server di java

Minchia ma ditelo! Lo sapete che è da pochi giorni che uso Linux e ultimamente sono stato occupato col contest e quindi non c'ho dedicato molto tempo.

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Tommo
17-01-2013, 16:39
@Tommo: hai apportato le modifiche ai sorgenti? quando posti la versione corretta?

Sono in mezzo a due release e in quanto a numero di bug non è andata per niente bene, mi metterò sul contest quando capita :asd:
Comunque non dovrebbe diventare più lento una volta fixato.

Vincenzo1968
17-01-2013, 16:42
I tempi di Vicius su Linux a 64 bit:

http://img43.imageshack.us/img43/3034/tempiviciuslinux64bit.jpg

Vincenzo1968
17-01-2013, 16:47
La macchina Linux è questa:

http://img685.imageshack.us/img685/6105/macchinalinux.jpg

;)

VICIUS
17-01-2013, 16:51
I tempi di Vicius su Linux a 64 bit:

http://img43.imageshack.us/img43/3034/tempiviciuslinux64bit.jpg

Vabbe ora non serve usare time. Nell'ultima ti ho messo il messaggio "ci ho messo xyz secondi". ;)

Vincenzo1968
17-01-2013, 16:55
Vabbe ora non serve usare time. Nell'ultima ti ho messo il messaggio "ci ho messo xyz secondi". ;)

Nell'ultima? Dov'è? :confused:

VICIUS
17-01-2013, 16:58
… "Nuova" versione http://cl.ly/MEjp…
Qui.

Vincenzo1968
17-01-2013, 17:21
Qui.
Ma se non stampa niente senza il comando time:

http://img845.imageshack.us/img845/993/tempinew.jpg

Vincenzo1968
17-01-2013, 17:30
Ah no, avevo fatto confusione io.

Minchia! 32 secondi!

http://img23.imageshack.us/img23/2046/tempiviciusnew.jpg

Grande Vicius! Che modifiche hai apportato?

Vincenzo1968
17-01-2013, 18:30
Su Windows XP a 32 bit invece è leggermente più veloce la mia:

http://img705.imageshack.us/img705/2092/tempi3gib.jpg

Ma non posso usare l'opzione "-server". :confused:

Vincenzo1968
17-01-2013, 19:12
Ho scaricato e reinstallato jre e jdk 7 ma niente da fare. La cartella server non c'è proprio su bin:

http://img210.imageshack.us/img210/7508/javaserver.jpg

http://img812.imageshack.us/img812/8426/javaserver2.jpg

:confused:

EDIT:

E il bello è che con la nuova versione di Java i tempi di Vicius peggiorano:

http://img35.imageshack.us/img35/3896/javaserver3.jpg

marco.r
17-01-2013, 20:06
Versione pigra (a.k.a. Unix Style)

Preparazione "base testo"

#!/bin/sh
# uso: prepare.sh <documenti di testo>
# esempio: prepare.sh *.txt
cat $* | sed -e 's/\s+/ /g' | grep -v '^\s*$' > text.dat


Generazione documenti

#!/bin/sh
# uso: generate.sh <n. linee> <output>
# esempio: generate.sh 1000 /tmp/testo.txt
shuf text.dat | head -n $1 > $2


La versione che prende come input la dimensione e' un po' piu' complicata :D

marco.r
17-01-2013, 20:59
Versione che prende dimensione e non linee

#!/bin/sh
SIZE=$(echo $1 | sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/;s/$/ +\\/; $a0' | bc)
BS=1000000
COUNT=$(echo 1 + $SIZE / $BS | bc )
OUTPUT=$2

echo > $OUTPUT
while $(test `stat --format '%s' $OUTPUT` -lt $SIZE )
do
shuf text.dat | dd bs=$BS iflag=fullblock count=$COUNT >> $OUTPUT
done
truncate -s $SIZE $OUTPUT

Meno elegante ma cmq efficace


time ./prepare.sh *.txt
./prepare.sh *.txt 1.80s user 0.52s system 115% cpu 2.002 total

time ./generate 1G prova.dat
./generate.sh 1G prova.dat 2.58s user 7.82s system 100% cpu 10.372 total

Vincenzo1968
17-01-2013, 21:34
Ciao Marco.

Interessante. Ma che è? Cioè, che linguaggio è? :D

AnonimoVeneziano
18-01-2013, 03:41
Tra un pochino arrivo pur io ... :O


:D

AnonimoVeneziano
18-01-2013, 03:48
Ah, approposito, se in un file di testo c'è tipo :

" \n"

E' considerata una linea vuota anche se c'è un carattere spazio all'inizio della linea o no?

VICIUS
18-01-2013, 06:14
Ah no, avevo fatto confusione io.

Minchia! 32 secondi!

http://img23.imageshack.us/img23/2046/tempiviciusnew.jpg

Grande Vicius! Che modifiche hai apportato?
Ho aggiunto un BufferedOutputStream. C'è anche la println che stampa i tempi ma non credo sia stata quella :D

Ciao Marco.

Interessante. Ma che è? Cioè, che linguaggio è? :D
È uno script per la shell. Anche piuttosto banale visto che sono due comandi in croce. Se rimarrai abbastanza su linux in futuro potresti imbatterti in mostruosità da migliaia di linee in questo linguaggio.

Ah, approposito, se in un file di testo c'è tipo :

" \n"

E' considerata una linea vuota anche se c'è un carattere spazio all'inizio della linea o no?
Io righe con soli spazi le ho ignorate.

Vincenzo1968
18-01-2013, 09:31
Ah, approposito, se in un file di testo c'è tipo :

" \n"

E' considerata una linea vuota anche se c'è un carattere spazio all'inizio della linea o no?

Si, esatto.

Vincenzo1968
18-01-2013, 09:35
Ho aggiunto un BufferedOutputStream. C'è anche la println che stampa i tempi ma non credo sia stata quella :D


È uno script per la shell. Anche piuttosto banale visto che sono due comandi in croce. Se rimarrai abbastanza su linux in futuro potresti imbatterti in mostruosità da migliaia di linee in questo linguaggio.


Io righe con soli spazi le ho ignorate.

Nein. Non le devi ignorare.

Se rimarrò abbastanza su Linux? Io non mi stacco più da Linux. :D

Senti maaaaa che cosa fa il parametro -server?
Su Linux che lo usi o no il tuo programma da gli stessi tempi(ma solo nell'ultima versione con BufferedOutputStream). E come mai non ce l'ho su XP?

AnonimoVeneziano
18-01-2013, 09:39
Aspe, mi sto confondendo :D

Devo ingnorare il fatto di eliminare la linea o ignorare la linea (nel senso di eliminarla) ? :sofico:

Vincenzo1968
18-01-2013, 09:48
La seconda che hai detto: va eliminata.

VICIUS
18-01-2013, 10:09
Nein. Non le devi ignorare.

Se rimarrò abbastanza su Linux? Io non mi stacco più da Linux. :D

Senti maaaaa che cosa fa il parametro -server?
Su Linux che lo usi o no il tuo programma da gli stessi tempi(ma solo nell'ultima versione con BufferedOutputStream). E come mai non ce l'ho su XP?

-server dice a java di compilare il codice e di gestire alcune cose in maniera diversa dal solito. Ci mette di più a partire ma in genere è più veloce per certi tipi di programmi.

Sul tuo linux probabilmente è attivo di default (avrai sicuro openjdk). Su windows non ti so aiutare. Stai parlando con l'ex moderatore della sezioni linux ed apple. Manco me lo ricordo come è fatto windows. :Prrr:

La seconda che hai detto: va eliminata.

Bene così. È quello che fa ora.

Vincenzo1968
18-01-2013, 11:44
Windows a 32 bit:
http://img404.imageshack.us/img404/5962/tempi1gibnew.jpg

Linux a 64 bit:
http://img827.imageshack.us/img827/2513/tempi1gibnew2.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
18-01-2013, 11:47
-server dice a java di compilare il codice e di gestire alcune cose in maniera diversa dal solito. Ci mette di più a partire ma in genere è più veloce per certi tipi di programmi.

Sul tuo linux probabilmente è attivo di default (avrai sicuro openjdk). Su windows non ti so aiutare. Stai parlando con l'ex moderatore della sezioni linux ed apple. Manco me lo ricordo come è fatto windows. :Prrr:

Bene così. È quello che fa ora.

Ah nientedimeno!

Eri moderatore della sezione Linux e io non ne sapevo niente. Pensavo che fossi moderatore qui, insieme a Cionci.

Sempre all'ultimo le debbo venire a sapere le cose :rolleyes:



:D

Vincenzo1968
18-01-2013, 12:01
Sul tuo linux probabilmente è attivo di default (avrai sicuro openjdk). Su windows non ti so aiutare. Stai parlando con l'ex moderatore della sezioni linux ed apple. Manco me lo ricordo come è fatto windows. :Prrr:
...


Può essere che su XP non è previsto? Debbo provare su Windows 8.

Vincenzo1968
18-01-2013, 14:19
http://img526.imageshack.us/img526/1747/tempimieisuper.jpg

http://www.hwupgrade.org/public/style_emoticons/default/challenge.png

VICIUS
18-01-2013, 14:27
480 mb/s in scrittura? :eek: Che diavolo di disco hai?

Vincenzo1968
18-01-2013, 14:45
480 mb/s in scrittura? :eek: Che diavolo di disco hai?

Alt! Fermi tutti!

Errore mio. Mi troncava il file a 2.5 GiB.

I tempi corretti sono questi:

http://img221.imageshack.us/img221/9162/tempimieisuper2.jpg

Era troppo bello per essere vero. :D

Vincenzo1968
18-01-2013, 14:52
http://img259.imageshack.us/img259/9491/codicel.jpg

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Non ci sono funzioni standard ansi C per gestire i file di grosse dimensioni?

Vincenzo1968
18-01-2013, 15:01
Domani posto il codice. Per il momento voglio vedere se riesco a ottimizzare ancora un pochino.

:D

banryu79
18-01-2013, 16:30
Può essere che su XP non è previsto? Debbo provare su Windows 8.
Io al momento ho due JRE nel mio pc: quella diciamo stand-alone (quella che di solito scaricano solo gli utenti) e quella presente in bundle con il JDK.

Beh, quella stand-alone non contiene la vm server, mentre quella nel JDK sì.

E quando lancio java da riga di comando non riesco ad usare la server vm perchè il path nella variabile di ambiente punta alla JRE "stand-alone"; mentre se lancio una main class dal NetBeans posso usarla (perchè ovvimente qui il path è quello della JRE in bundle col JDK... che a sua volta ho scaricato in bundle con NetBeans :D )

Vincenzo1968
18-01-2013, 16:39
Pure io ce l'ho nel jdk:

http://img607.imageshack.us/img607/7508/javaserver.jpg

E ho messo il percorso nelle variabili d'ambiente(la variabile PATH).

Ma nisba. :confused:

Poi provo su Windows 8.

Certo che Linux è tutto un altro mondo :D

Vincenzo1968
18-01-2013, 19:37
Su Windows 8 l'opzione -server ce l'ho:

http://img27.imageshack.us/img27/1707/tempiwin8.jpg

:D

La macchina è questa:
http://img545.imageshack.us/img545/5976/macchinanuova.jpg

Il mio programma l'ho compilato a 64 bit con Visual Studio 2012.

Comunque se eseguito successivamente, dalla seconda volta in poi, il tempo di Vicius scende a 110 secondi. Sarà perché la prima volta i file non erano in cache ;)

AnonimoVeneziano
19-01-2013, 03:49
Ed eccolo che alle 3 e mezza di notte (4 e mezza per voi) :sofico: tornato dal pub si mette a programmare la sua versione! :asd:

L'ho fatta in C99 perché mi andava :asd: Non ho potuto testarlo su Windows perché non ce l'ho qua, ma su Linux e Mac va.

Da compilare consigliato con:

clang -std=c99 -O3 -fstrict-aliasing -march=corei7 c19input2.c -o c19input
o
gcc -std=gnu99 -O3 -fstrict-aliasing -march=corei7 c19input2.c -o c19input


Per semplicità ho fatto che tutti i file da cui lavorare sono presi da una cartella presente nella directory corrente chiamata "All", quindi i file di testo da caricare dovrebbero stare in ./All/*txt (nel file che ho uploadato su file dropper i file sono già contenuti).
Questo parametro sarebbe facilmente spostabile in un parametro da passare a linea di comando ... ma non ne ho voglia ora :asd:

Ne ho fatte 2 versioni: c19input.c e c19input2.c.

L'unica differenza è che la seconda usa un buffer in scrittura e POTREBBE essere più veloce ( sperimentalmente in tempi è più veloce, ma per qualche ragione la velocità di scrittura rilevata è minore)

Esempio di run:

europa:Contest Kariddi$ ./c19input output.txt -D10GiB
Started loading the files
Files loaded, it took: 0.012177 seconds

Started processing the files
File processing finished, it took: 0.075228 seconds

Started final file output
Final file output finished, it took: 24.184353 seconds



http://www.filedropper.com/c19input_3

Cheers!

Vincenzo1968
19-01-2013, 09:26
Con Visual Studio 2010 su Windows non trova dirent.h:

http://img441.imageshack.us/img441/3125/anonimo1p.jpg

Mo provo su Linux con GCC.

Vincenzo1968
19-01-2013, 09:31
Per semplicità ho fatto che tutti i file da cui lavorare sono presi da una cartella presente nella directory corrente chiamata "All", quindi i file di testo da caricare dovrebbero stare in ./All/*txt (nel file che ho uploadato su file dropper i file sono già contenuti).
Questo parametro sarebbe facilmente spostabile in un parametro da passare a linea di comando ... ma non ne ho voglia ora :asd:


Pure io e Vicius(e Tommo) abbiamo fatto cosi. Mettiamola come regola: I file da leggere in input devono stare nella directory All(sottodirectory di quella in cui si trova l'eseguibile).

;)

Vincenzo1968
19-01-2013, 09:51
Ecco il mio sorgente:

http://www.filedropper.com/contest19

Va compilato cosi:

gcc -O3 main.c -o C19Gen


o


clang -O3 main.c -o C19Gen


o


icc -O3 main.c -o C19Gen


Se usate Visual Studio, invece, ricordatevi di selezionare l'opzione "Compile as C" e non "Compile as C++" :mbe:

Il file rand.dat dev'essere piazzato nella stessa directory dell'eseguibile.

Vincenzo1968
19-01-2013, 10:23
I tempi di AnonimoVeneziano su Linux:

http://img19.imageshack.us/img19/6905/tempianonimoveneziano.jpg

mi batte di 3/4 secondi.

Mo provo a compilare il mio con le opzioni "-fstrict-aliasing -march=corei7".

EDIT: non succede niente. I tempi rimangono uguali.

AnonimoVeneziano
19-01-2013, 10:23
Con Visual Studio 2010 su Windows non trova dirent.h:

http://img441.imageshack.us/img441/3125/anonimo1p.jpg

Mo provo su Linux con GCC.

Mmm, immaginavo ci sarebbero stati problemi del genere su visual studio ...

Mi sa che l'unica cosa sarebbe usare MinGW o usare una libreria che implementa Windows come questa http://softagalleria.net/dirent.php .... o certo, potrei usare io direttamente le API di windows (e mettere nel codice dei bei #if) ... ma che palle :sofico: Dovrò valutare

Vincenzo1968
19-01-2013, 10:32
Mmm, immaginavo ci sarebbero stati problemi del genere su visual studio ...

Mi sa che l'unica cosa sarebbe usare MinGW o usare una libreria che implementa Windows come questa http://softagalleria.net/dirent.php .... o certo, potrei usare io direttamente le API di windows (e mettere nel codice dei bei #if) ... ma che palle :sofico: Dovrò valutare

Ah vero! posso usare mingw, m'ero scordato!

Un attimino che provo :D

AnonimoVeneziano
19-01-2013, 10:46
Ah vero! posso usare mingw, m'ero scordato!

Un attimino che provo :D

Ho notato che ho anche sbagliato il nome delle funzioni _fseeki64 e _ftelli64 nel sorgente, che invece ho nominato _fseek64 e _ftell64 .

Comunque mo vedo se riesco a farlo più Windows compatibile, visto che adesso posso testarlo su Win 8

Vincenzo1968
19-01-2013, 10:53
E infatti da problemi anche mingw:

http://img28.imageshack.us/img28/2805/anonimo2f.jpg

All'inizio dava problemi con int64_t ma ho risolto aggiungendo il file include stdint.h

Da problemi con _fseek64 e _ftell64

VICIUS
19-01-2013, 10:54
Questi i tempi sul mio mac

Vincenzo1968
➜ Contest time ./vincenzo file -D5GiB
./vincenzo file -D5GiB 7.83s user 9.38s system 19% cpu 1:29.49 total

AnonimoVeneziano
➜ Contest time ./hay file -D5GiB
./hay file -D5GiB 4.81s user 8.82s system 15% cpu 1:29.41 total

VICIUS
➜ Contest time java -server Generate file -D5GiB
java -server Generate file -D5GiB 20.11s user 7.65s system 29% cpu 1:33.17 total

Tommo
➜ Contest time ./tommo file -D5GB
./tommo file -D5GB 3.62s user 10.12s system 15% cpu 1:29.70 total

I tre programmi C sono identici come tempi. Il mio java leggermente più indietro ma vince in semplicità, chiarezza e bellezza del codice. :O

Vincenzo1968
19-01-2013, 11:00
Questi i tempi sul mio mac

Vincenzo1968
➜ Contest time ./vincenzo file -D5GiB
./vincenzo file -D5GiB 7.83s user 9.38s system 19% cpu 1:29.49 total

AnonimoVeneziano
➜ Contest time ./hay file -D5GiB
./hay file -D5GiB 4.81s user 8.82s system 15% cpu 1:29.41 total

VICIUS
➜ Contest time java -server Generate file -D5GiB
java -server Generate file -D5GiB 20.11s user 7.65s system 29% cpu 1:33.17 total

Tommo
➜ Contest time ./tommo file -D5GB
./tommo file -D5GB 3.62s user 10.12s system 15% cpu 1:29.70 total

I tre programmi C sono identici come tempi. Il mio java leggermente più indietro ma vince in semplicità, chiarezza e bellezza del codice. :O

Ah si, il mio è molto(ma molto) più grosso del tuo. :D

Vincenzo1968
19-01-2013, 11:02
Ho notato che ho anche sbagliato il nome delle funzioni _fseeki64 e _ftelli64 nel sorgente, che invece ho nominato _fseek64 e _ftell64 .

Comunque mo vedo se riesco a farlo più Windows compatibile, visto che adesso posso testarlo su Win 8

Ho cambiato le funzioni così:


#define fseeko _fseeki64
#define ftello _ftelli64


Ma ottengo un errore del linker:


C:\Contest19\AnonimoVeneziano\c19input\Contest>gcc -std=gnu99 -O3 c19input.c -o
c19input
c19input.c: In function 'get_file_size':
c19input.c:52:3: warning: implicit declaration of function '_fseeki64' [-Wimplic
it-function-declaration]
c19input.c:53:3: warning: implicit declaration of function '_ftelli64' [-Wimplic
it-function-declaration]
C:\DOCUME~1\VLC\IMPOST~1\Temp\ccCpkAI0.o:c19input.c:(.text+0x2f): undefined refe
rence to `_fseeki64'
C:\DOCUME~1\VLC\IMPOST~1\Temp\ccCpkAI0.o:c19input.c:(.text+0x37): undefined refe
rence to `_ftelli64'
C:\DOCUME~1\VLC\IMPOST~1\Temp\ccCpkAI0.o:c19input.c:(.text+0xaa): undefined refe
rence to `_fseeki64'
C:\DOCUME~1\VLC\IMPOST~1\Temp\ccCpkAI0.o:c19input.c:(.text+0xb2): undefined refe
rence to `_ftelli64'
c:/programmi/mingw32/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe
: C:\DOCUME~1\VLC\IMPOST~1\Temp\ccCpkAI0.o: bad reloc address 0x0 in section `.d
ata'
c:/programmi/mingw32/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe
: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status


Con Visual Stufio, nel mio, ho fatto così:


#ifdef __linux__
fseeko(fpRand, 0, SEEK_END);
sizeRand = ftello(fpRand);
fseeko(fpRand, 0, SEEK_SET);
#else
_fseeki64(fpRand, 0, SEEK_END);
sizeRand = _ftelli64(fpRand);
_fseeki64(fpRand, 0, SEEK_SET);
#endif


Possibile che non esistano funzioni C standard per gestire i file > 4 GiB?

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Vincenzo1968
19-01-2013, 11:12
Questi i tempi sul mio mac

Vincenzo1968
➜ Contest time ./vincenzo file -D5GiB
./vincenzo file -D5GiB 7.83s user 9.38s system 19% cpu 1:29.49 total

AnonimoVeneziano
➜ Contest time ./hay file -D5GiB
./hay file -D5GiB 4.81s user 8.82s system 15% cpu 1:29.41 total

VICIUS
➜ Contest time java -server Generate file -D5GiB
java -server Generate file -D5GiB 20.11s user 7.65s system 29% cpu 1:33.17 total

Tommo
➜ Contest time ./tommo file -D5GB
./tommo file -D5GB 3.62s user 10.12s system 15% cpu 1:29.70 total

I tre programmi C sono identici come tempi. Il mio java leggermente più indietro ma vince in semplicità, chiarezza e bellezza del codice. :O

Non puoi fare degli screenshot? Qual è il tempo da considerare? system? user?

http://www.hwupgrade.org/public/style_emoticons/default/rage.png]

VICIUS
19-01-2013, 11:18
Non puoi fare degli screenshot? Qual è il tempo da considerare? system? user?

http://www.hwupgrade.org/public/style_emoticons/default/rage.png]

Nessuno dei due. Il tempo reale è l'ultimo.

AnonimoVeneziano
19-01-2013, 11:30
Non ti preoccupare, mo ci lavoro un po' per farlo andare con Visual Studio nativo :O

Non mi piacciono sti hack :D

Vincenzo1968
19-01-2013, 12:17
http://img17.imageshack.us/img17/6105/macchinalinux.jpg

http://img62.imageshack.us/img62/6893/tempi01.jpg

http://img717.imageshack.us/img717/7590/tempi02.jpg

I tempi di Tommo non li ho presi perché deve ancora sistemare l'output(anche se il tempo impiegato non dovrebbe variare di molto).

AnonimoVeneziano
19-01-2013, 12:22
Ecco una versione aggiornata per lavorare sia su Unix che su Windows (testato solo Win8 + VS2012)

I file sono da compilare come "C++" anche se sono "C99" a causa del fatto che il compilatore MS in modalità C non supporta la dichiarazione delle variabili in mezzo ai blocchi.

La versione 2 su windows sulla mia macchina è qualche secondo più veloce pare.

http://www.filedropper.com/c19input_4
Ciao

AnonimoVeneziano
19-01-2013, 12:32
Vic, per la tua versione che versione di Java hai usato?

Con la 1.6 javac mi da un sacco di errori di compilazione, come mai? :confused:

Vincenzo1968
19-01-2013, 12:39
Ecco una versione aggiornata per lavorare sia su Unix che su Windows (testato solo Win8 + VS2012)

I file sono da compilare come "C++" anche se sono "C99" a causa del fatto che il compilatore MS in modalità C non supporta la dichiarazione delle variabili in mezzo ai blocchi.

La versione 2 su windows sulla mia macchina è qualche secondo più veloce pare.

http://www.filedropper.com/c19input_4
Ciao

No, non da me; stranamente la versione 2 è più lenta di un secondo. Ecco i tempi presi compilando i nuovi sorgenti:

http://img818.imageshack.us/img818/3776/tempianonimo.jpg

Più tardi lo provo su Windows. Mo vado a magna'.

:D

AnonimoVeneziano
19-01-2013, 12:42
No, non da me; stranamente la versione 2 è più lenta di un secondo. Ecco i tempi presi compilando i nuovi sorgenti:


Più tardi lo provo su Windows. Mo vado a magna'.

:D

Appunto è Windows o MSVC che fanno diventare la seconda più veloce (almeno sulla mia macchina), perchè su Mac è più veloce la prima. Magari dipende dalle implementazioni delle librerie del C.

Bon appetit!

EDIT: Mi sono permesso di fare una versione del tuo main.c che compila anche sul mio Macbook

http://www.filedropper.com/main_3

Vincenzo1968
19-01-2013, 13:10
Appunto è Windows o MSVC che fanno diventare la seconda più veloce (almeno sulla mia macchina), perchè su Mac è più veloce la prima. Magari dipende dalle implementazioni delle librerie del C.

Bon appetit!

EDIT: Mi sono permesso di fare una versione del tuo main.c che compila anche sul mio Macbook

http://www.filedropper.com/main_3

Hai fatto benissimo! Anzi ti debbo ringraziare!
:D

Purtroppo su Visual Studio 2010 ottengo questi errori:


1>------ Rebuild All started: Project: AnonimoVeneziano2, Configuration: Release Win32 ------
1> c19input2.c
1>c19input2.c(58): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Programmi\Microsoft Visual Studio 10.0\VC\include\stdio.h(234) : see declaration of 'fopen'
1>c19input2.c(60): warning C4244: '=' : conversion from '__int64' to 'size_t', possible loss of data
1>c19input2.c(79): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Programmi\Microsoft Visual Studio 10.0\VC\include\stdio.h(234) : see declaration of 'fopen'
1>c19input2.c(150): error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c19input2.c(161): error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c19input2.c(168): error C2664: 'strlen' : cannot convert parameter 1 from 'WCHAR [260]' to 'const char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c19input2.c(173): error C2664: 'strncpy' : cannot convert parameter 2 from 'WCHAR [260]' to 'const char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c19input2.c(269): warning C4018: '<' : signed/unsigned mismatch
1>c19input2.c(272): warning C4018: '<' : signed/unsigned mismatch
1>c19input2.c(274): warning C4018: '>' : signed/unsigned mismatch
1>c19input2.c(275): warning C4244: '=' : conversion from 'uint64_t' to 'int32_t', possible loss of data
1>c19input2.c(333): warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

VICIUS
19-01-2013, 13:15
Vic, per la tua versione che versione di Java hai usato?

Con la 1.6 javac mi da un sacco di errori di compilazione, come mai? :confused:
Java 7

Vincenzo1968
19-01-2013, 13:18
Vicius o AnonimoVeneziano(o tutt'e due) potreste gentilmente postare uno screeshot. Così, tanto per avere il prio* di vedere la mia applicazioncina girare su Mac.

:D





*prio = dialetto siciliano. Vuol dire "piacere".

Vincenzo1968
19-01-2013, 13:24
Ho risolto il problema con Visual Studio 2010 per i sorgenti di AnonimoVeneziano. Bisogna compilare con l'opzione Character Set=Not Set(e non con Use Unicode character set).

Mo provo i tempi su XP a 32 bit.

;)

AnonimoVeneziano
19-01-2013, 13:26
Java 7

Ah ok, dopo provo a reperirlo.

@Vincenzo mo ti faccio lo screen :P (non è molto diverso da linux eh :) )

Edit:
Ecco

http://i.imgur.com/jAO0FGu.png (http://imgur.com/jAO0FGu)

VICIUS
19-01-2013, 13:32
Ho risolto il problema con Visual Studio 2010 per i sorgenti di AnonimoVeneziano. Bisogna compilare con l'opzione Character Set=Not Set(e non con Use Unicode character set).

Mo provo i tempi su XP a 32 bit.

;)

:asd:

http://f.cl.ly/items/3B2b3J1j331l062r0I0q/screenshot-vincenzo.png

Comunque. Non so come tu faccia a calcolare i tempi ma canni di brutto. Non ci ha messo neanche lontanamente 15 secondi a creare il file. Sia l'iphone che l'orologio da muro della cucina riportano lo stesso tempo di time.

Vincenzo1968
19-01-2013, 13:40
Si, su Windows XP a 32 bit, l'applicazione 2 di AnonimoVeneziano risulta più veloce di qualche secondo.

Vado a provare su Windows 8 a 64 bit.

Vincenzo1968
19-01-2013, 13:45
Ah ok, dopo provo a reperirlo.

@Vincenzo mo ti faccio lo screen :P (non è molto diverso da linux eh :) )

Edit:
Ecco

http://i.imgur.com/jAO0FGu.png (http://imgur.com/jAO0FGu)

:asd:

http://f.cl.ly/items/3B2b3J1j331l062r0I0q/screenshot-vincenzo.png

Comunque. Non so come tu faccia a calcolare i tempi ma canni di brutto. Non ci ha messo neanche lontanamente 15 secondi a creare il file. Sia l'iphone che l'orologio da muro della cucina riportano lo stesso tempo di time.

Grazie mille a entrambi!

Come sarebbe canno? :confused:

int main(int argc, char* argv[])
{
char szFileName[256];
unsigned char *bufferIn = NULL;
unsigned char *bufferOut = NULL;
long sizeBuffer;
double Tempo1;
double Tempo2;
double Tempo3;
double TempoTotale;
uint64_t sizeOutput;
clock_t c_start, c_end;


if ( argc < 2 )
{

#ifdef __linux__
PrintHelp(argv[0]);
#else
ExtractFileName(argv[0], szFileName);
PrintHelp(szFileName);
#endif

printf("\nPremere INVIO per terminare.");
getc(stdin);

return -1;
}

//srand((unsigned)time(NULL));

printf("\nElaborazione del file %s in corso.\nAttendere prego...\n", argv[1]);

if ( argc >= 3 )
sizeOutput = GetSizeOutput(argv[2]);
else
sizeOutput = 1024 * 1024;

c_start = clock();
sizeBuffer = MakeBuffer(&bufferIn);
c_end = clock();
Tempo1 = (double)(c_end - c_start) / CLOCKS_PER_SEC;
printf("\nTempo impiegato per lettura dati -> %5.5f secondi\n", Tempo1);


c_start = clock();
sizeBuffer = DFA(bufferIn, &bufferOut, sizeBuffer);
c_end = clock();
Tempo2 = (double)(c_end - c_start) / CLOCKS_PER_SEC;
printf("\nTempo impiegato per eliminare spazi e righe vuote -> %5.5f secondi\n", Tempo2);

c_start = clock();
Mescola(bufferOut, argv[1], sizeBuffer, sizeOutput);
c_end = clock();
Tempo3 = (double)(c_end - c_start) / CLOCKS_PER_SEC;
printf("\nTempo impiegato per mescolare-> %5.5f secondi\n", Tempo3);

TempoTotale = Tempo1 + Tempo2 + Tempo3;
printf("\nTempo totale -> %5.5f secondi\n", TempoTotale);

if ( bufferIn )
free(bufferIn);
else
printf("\nbufferIn e' NULL.\n");

if ( bufferOut )
free(bufferOut);
else
printf("\nbufferOut e' NULL.\n");

printf("\nPremere INVIO per terminare.");
getc(stdin);

return 0;
}


:confused:

Vincenzo1968
19-01-2013, 14:13
7,15 + 8,51 = 15,66

che è approssimativamente uguale a 15,559944

:confused:

AnonimoVeneziano
19-01-2013, 14:21
Credo che usando "clock" (sia io che te) calcoliamo il tempo CPU che le rispettive funzioni impiegano piuttosto che il tempo ver

Il tempo reale di "time" dovrebbe essere quello più giusto (comprendente sia il tempo CPU che il tempo di I/O utilizzato, che non è considerato da "clock"), mentre il nostro tempo (che dovrebbe essere uguale a sys+usr di time) indica il tempo CPU utilizzato dal programma per fare il suo lavoro lavoro.

IMHO

Ciao

Vincenzo1968
19-01-2013, 14:23
Credo che usando "clock" (sia io che te) calcoliamo il tempo CPU che le rispettive funzioni ci impiegano a terminare piuttosto dal tempo vero, che invece (visto che usiamo funzioni di I/O che non sono computate da clock) in realtà il tempo reale è più alto.

Il tempo reale di "time" dovrebbe essere quello più giusto (comprendente sia il tempo CPU che il tempo di IO), mentre il nostro tempo (che dovrebbe essere uguale a sys+usr di time) indica il tempo CPU utilizzato dal programma per fare il suo lavoro lavoro.

IMHO

Ciao

Minchia ma allora i nostri tempi, se ho ben capito, sono migliori di quelli mostrati a video con printf!
Giusto?

AnonimoVeneziano
19-01-2013, 14:25
Minchia ma allora i nostri tempi, se ho ben capito, sono migliori di quelli mostrati a video con printf!
Giusto?

No, sono peggiori. Scusa, ho fatto un casino col copy paste nel messaggio precedente :asd: e non si capisce niente :p

In pratica i nostri tempi considerano solo il tempo CPU utilizzato dal programma. Quando però fai una "fwrite" in realtà il tuo programma si blocca e passa al sistema operativo per fare I/O. Io non credo che quel tempo sia computato da "clock" , almeno su Mac (su win non so , ma credo che anche lì sia lo stesso).

Ciao

AnonimoVeneziano
19-01-2013, 14:35
Esempio dei nostri programmi:

http://i.imgur.com/QquFJNZ.png (http://imgur.com/QquFJNZ)

Il tuo programma ci impiega 6.8+7.4s di tempo CPU a lavorare, ma in totale (a causa dell'IO) in realtà impiega 21.5s.

Il mio invece impiega 5.4+7.4s di tempo CPU (quindi in teoria un pochino più veloce) ma a causa dell'io ce ne impiega 21 di secondi.

Quindi la velocità netta delle due versioni è praticamente la stessa a causa dell'IO (il programma è IO bound), mentre la mia seconda versione non è in grado di saturare la banda dell'IO del mio SSD risultando in tempi totali un po' più lenta (nonostante usi meno tempo CPU).

Questa è la mia teoria a riguardo :)

Ciao

Vincenzo1968
19-01-2013, 14:40
In effetti il tempo "Real" è leggermente superiore:

http://img14.imageshack.us/img14/3512/c19tempireal01.jpg

http://img21.imageshack.us/img21/263/c19tempireal02.jpg

Non c'è modo di prendere il tempo Real in C?

AnonimoVeneziano
19-01-2013, 14:50
In effetti il tempo "Real" è leggermente superiore:

Non c'è modo di prendere il tempo Real in C?

probabilmente utilizzando funzioni del sistema operativo che ti ritornano il tempo in millisecondi dall'inizio del programma ( o dalla epoch). "time()" non è adatta perchè ritorna secondi.

Su UNIX c'è "gettimeofday()" che ritorna secondi e microsecondi dalla epoch e si può usare per fare calcoli del genere. Per windows ci sarà un equivalente.

CLOCK comunque rimane il sistema migliore per calcolare le performance (a meno che non ci sia di mezzo dell'IO pesante come in questo caso)

Vincenzo1968
19-01-2013, 14:55
Alt! Fermi tutti!

Se tolgo "Premere INVIO per terminare" ottengo tempi real migliori:

http://img201.imageshack.us/img201/7619/tempimieireal.jpg

Togliete dunque, nella funzione main, queste due righe di codice:


printf("\nPremere INVIO per terminare.");
getc(stdin);


D'ora in poi useremo il comando time per misurare i tempi. Io ve lo dicevo. Voi avete insistito per far stampare il tempo a video... :O

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
19-01-2013, 14:57
probabilmente utilizzando funzioni del sistema operativo che ti ritornano il tempo in millisecondi dall'inizio del programma ( o dalla epoch). "time()" non è adatta perchè ritorna secondi.

Su UNIX c'è "gettimeofday()" che ritorna secondi e microsecondi dalla epoch e si può usare per fare calcoli del genere. Per windows ci sarà un equivalente.

CLOCK comunque rimane il sistema migliore per calcolare le performance (a meno che non ci sia di mezzo dell'IO pesante come in questo caso)

Ok! Allora per questo contest useremo sempre il comando time per calcolare i tempi.
Su Windows dovrebbe essere disponibile installando le GnuWin32 libraries(un porting di molti utili comandi unix su windows):

http://getgnuwin32.sourceforge.net/

;)

AnonimoVeneziano
19-01-2013, 14:59
Alt| Fermi tutti!

Se tolgo "Premere INVIO per terminare" ottengo tempi real migliori:

http://img201.imageshack.us/img201/7619/tempimieireal.jpg

Togliete dunque, nella funzione main, queste due righe di codice:


printf("\nPremere INVIO per terminare.");
getc(stdin);


D'ora in poi useremo il comando time per misurare i tempi. Io ve lo dicevo. Voi avete insistito per far stampare il tempo a video... :O

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

L'avevo già tolto. :D

Vincenzo1968
19-01-2013, 15:17
Niente da fare:

http://img838.imageshack.us/img838/4189/timewin.jpg

Il comando time non è disponibile su Windows nemmeno installando le GnuWin32.

Per questo contest utilizzerò Linux.

Windows :rolleyes:

:D

EDIT: o, meglio, i tempi li prenderò anche su Windows e mostrerò gli screenshot ma, per le classifiche, i tempi saranno quelli calcolati col comando time su Linux. ;)

Vincenzo1968
19-01-2013, 15:47
http://img24.imageshack.us/img24/4121/tempifinali01.jpg

http://img521.imageshack.us/img521/2702/tempifinali02.jpg

AnonimoVeneziano
19-01-2013, 16:02
Ma in gnuwin32 non c'è time a disposizione?

Vincenzo1968
19-01-2013, 16:21
Ma in gnuwin32 non c'è time a disposizione?

Evidentemente no. Dando il comando mi dice che ho inserito l'ora sbagliata. :D (naturalmente ho GnuWin32 installato nel mio sistema da un bel pezzo per via di Flex e Bison. E ho anche messo il percorso in PATH nelle variabili d'ambiente Windows).

Vincenzo1968
19-01-2013, 18:58
C'è una cosa che non mi quadra nello screenshot di Vicius:

7,15 secondi user
8,51 secondi system
E real(totoal)? un minuto e trenta secondi?

Non può essere. Sia da me che da AnonimoVeneziano(sul suo Mac) la differenza tra il totale di user e system e real è di pochi secondi(tre, quattro, cinque al massimo; massimo massimo massimo dieci).

Che cacchio è?
:confused:

Vincenzo1968
19-01-2013, 19:49
Niente da fare:

http://img838.imageshack.us/img838/4189/timewin.jpg

Il comando time non è disponibile su Windows nemmeno installando le GnuWin32.

Per questo contest utilizzerò Linux.

Windows :rolleyes:

:D

EDIT: o, meglio, i tempi li prenderò anche su Windows e mostrerò gli screenshot ma, per le classifiche, i tempi saranno quelli calcolati col comando time su Linux. ;)

Però anche così, pensandoci bene, non mi pare giusto. Il tempo real mio e quello di AnonimoVeneziano coincidono ma lui utilizza un algoritmo-metodo un po' più efficiente rispetto al mio.

Che si può fare? come possiamo risolvere la cosa?

:confused:

Vincenzo1968
19-01-2013, 22:28
Secondo me conviene, per la classifica, prendere i tempi user e system e sommarli.

Anche perché ho eliminato un paio di printf dal mio codice e il tempo real scende a 27 secondi circa(27 virgola qualcosa, quasi ventotto). Il che mi vedrebbe vincitore ma non è assolutamente giusto visto che l'algoritmo-metodo di AnonimoVeneziano è più efficiente del mio.

Ditemi che ne pensate.

VICIUS
20-01-2013, 12:04
Più veloce delle versioni C. Sia come tempo totale che come somma di user+system. :sborone:
➜ Contest time java -server Generate prova -D5GiB
ci ho messo 88 secondi
java -server Generate prova -D5GiB 6.74s user 5.79s system 14% cpu 1:28.81 total

Generate.java (http://cl.ly/MIMV)

Vincenzo1968
20-01-2013, 12:22
http://img801.imageshack.us/img801/2057/errorevicius.jpg

Cos'ho sbagliato questa volta?

I tre file generati dal compilatore Generate.class, Generate$1.class e Generate$FileParser.class li ho piazzati nella directory "contest"

VICIUS
20-01-2013, 12:36
Urca mi sono scordato di definire il package in cima al file. A questo punto non ti serve la cartella contest e quel "contest." quando lo lanci.

Vincenzo1968
20-01-2013, 12:50
http://img94.imageshack.us/img94/2997/tempinew01.jpg

http://img255.imageshack.us/img255/1306/tempinew02.jpg

Debbo dire che Java mi sta favorevolmente impressionando.

Comunque, Vicius, come si spiega quel minuto e trenta del tempo total nel tuo screeshot?

Io da me ho controllato con l'orologio da polso(domani compro un cronometro) ed effettivamente ci impiega circa 29 secondi.

Vincenzo1968
20-01-2013, 12:57
Più veloce delle versioni C. Sia come tempo totale che come somma di user+system. :sborone:
➜ Contest time java -server Generate prova -D5GiB
ci ho messo 88 secondi
java -server Generate prova -D5GiB 6.74s user 5.79s system 14% cpu 1:28.81 total

Generate.java (http://cl.ly/MIMV)

Nein! Uguale(o leggermente meno veloce) almeno da me, sulla mia macchina.

:D

VICIUS
20-01-2013, 13:01
Comunque, Vicius, come si spiega quel minuto e trenta del tempo total nel tuo screeshot?

Io da me ho controllato con l'orologio da polso(domani compro un cronometro) ed effettivamente ci impiega circa 29 secondi.
Hai un ssd immagino. Il mio è un normale hd da portatile. Scrive sui 60 mb/s quindi 1 minuto e trenta per scrivere 5 gb ci stanno tutti.

Vincenzo1968
20-01-2013, 13:04
Hai un ssd immagino. Il mio è un normale hd da portatile. Scrive sui 60 mb/s quindi 1 minuto e trenta per scrivere 5 gb ci stanno tutti.

Ah ok!

Ho visto che anche col tuo programma ci mette pochi secondi come somma di user e system e circa un minuto e mezzo total.

Dillo prima, no? mi fai venire un colpo :rolleyes:

:D

Senti maaaaaaaa,

le modifiche apportate? Vuoi spiegare come sei riuscito a ridurre notevolmente i tempi?

Vincenzo1968
20-01-2013, 13:21
Senti maaaaaaa,

se bufferizzo in blocchi anche la lettura del file in input dici che lo recupero mezzo secondo? e se tolgo le printf inutili(tipo "sto elaborando il file x. Attendere prego") il tempo real scende di un pochino?

Mo provo.

Vincenzo1968
20-01-2013, 14:24
In B4: ansia da prestazione.

Si, qualcosina sparagno bufferizzando l'input in blocchi. Poco, un secondo, ma sparagno:

http://img689.imageshack.us/img689/7716/tempimieinew.jpg

:D

Vincenzo1968
20-01-2013, 14:34
Ahhhhhhhhh un minuto!


java.util.concurrent


Stai usando il multithreading. Allora pure io posso fare così. Con OpenMP o a mano, sfruttando le api del sistema operativo.

Vedrai se non dimezzo i tempi pure io... :D

http://openmp.org/wp/

http://gcc.gnu.org/wiki/openmp

http://gcc.gnu.org/projects/gomp/

http://gcc.gnu.org/onlinedocs/libgomp/

https://computing.llnl.gov/tutorials/openMP/

Vicius s'è, come si suol dire, data la zappa sui piedi.

VICIUS
20-01-2013, 16:15
Ahhhhhhhhh un minuto!


java.util.concurrent



Vicius s'è, come si suol dire, data la zappa sui piedi.

Ma anche no. :asd:

È vero che ho sparato la lettura dei file su thread multipli ma l'ho fatto solo per divertimento. Non credo di aver ottenuto un incremento di prestazioni con quello.

Piuttosto eliminando la regex per la pulizia dei file e passando a nio ho potuto costruirmi in anticipo i bytebuffer che avrei usato poi durante la scrittura, mappare in memoria i file da leggere, gestirmi il buffering a mano ed allocare i buffer fuori dal heap.

Usando collectins.shuffle al posto di Random dovrei aver anche aiutato il processore che di sicuro prima sbarellava a causa degli accessi completamente casuali alla memoria.

Vincenzo1968
20-01-2013, 16:36
Ehm, Vicius, ma hai provato a creare un file di 1 MB e aprirlo con un qualunque editor di testo?

A me crea un file vuoto.

Infatti se faccio proprietà mi ritrovo dimensione 0 byte(leggasi zero byte).

http://img515.imageshack.us/img515/7867/outvicius.jpg

Vincenzo1968
20-01-2013, 16:46
Debbo provare pure io con la mappatura dei file in memoria. Su Windows so quali api utilizzare. E su Linux?

Vincenzo1968
20-01-2013, 16:53
Alt! Fermi tutti!

Trovato:


#include <sys/mman.h>
void * mmap (void *addr,
size_t len,
int prot,
int flags,
int fd,
off_t offset);

AnonimoVeneziano
20-01-2013, 17:01
Vincenzo, credo che alla fine per questo tipo di programma abbiamo raggiunto il limite.

Io sul mio mac con l'SSD faccio fino a 280 MB/s di banda in scrittura saturandolo completamente col programma. Se saturi completamente l'IO non credo che ci sia molto altro da guadagnare in questo tipo di programmi fortemente "IO based" se non al max qualche decimo di secondo.

Vic ha migliorato perchè è passato da una versione che era ancora CPU bound a una versione , ora IO bound sulla sua macchina (infatti sulla sua macchina fa i nostri stessi tempi).

Lanciandolo però su macchine con banda IO molto più ampia (come i nostri PC con SSD) alla fine ritorna CPU bound, anche se di poco, e da qui credo si spiega il distacco di qualche secondo rispetto a noi. Se fosse possibile avere sistemi di IO ancora più veloci allora il distacco tra versione Java e C probabilmente si amplierebbe ulteriormente.

Ciao

Vincenzo1968
20-01-2013, 17:17
Effettivamente non vale la pena.

Vicius ha migliorato ma il file prodotto è vuoto: zero byte.

:D

Vincenzo1968
20-01-2013, 17:37
Ragazzi,

ancora non mi avete detto come preferite misurare il tempo: prendiamo la somma di sys e user o prendiamo real?

Vincenzo1968
20-01-2013, 19:05
Il programma di Vicius, su file di grosse dimensioni, non risulta zero byte, ma:

http://img407.imageshack.us/img407/8159/verifica.jpg

verifica.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#include <stdint.h>

void PrintHelp(const char *szProg)
{
printf("\nUso: %s NomeFileInput\n", szProg);
}

int main(int argc, char* argv[])
{
FILE *fp;
char szFileName[256];
char * str = NULL;
int k;

if ( argc < 2 )
{

#ifdef __linux__ /* || __APPLE__*/
PrintHelp(argv[0]);
#else
ExtractFileName(argv[0], szFileName);
PrintHelp(szFileName);
#endif

printf("\nPremere INVIO per terminare.");
getc(stdin);

return -1;
}

str = (char*)malloc(1024*1024);
if ( !str )
{
printf("\nImpossibile allocare la memoria. Addio!\n");
return 0;
}

fp = fopen(argv[1], "r");
if ( fp == NULL )
{
printf("Errore nell'apertura del file %s\n", argv[1]);
return 0;
}

//for (k = 0; k < 5; k++)
while (fgets(str, 1024*1024, fp) != NULL)
{
k++;
if ( k > 4 )
break;
}
printf("Ho letto %d stringhe.", k);
printf("L'ultima e': %s\n", str);

free(str);
fclose(fp);

return 0;
}

Vincenzo1968
20-01-2013, 19:21
Scaricatevi il file eseguibile verifica per Linux a 64 bit da qui:

http://www.filedropper.com/verificatar

Qui, invece, l'eseguibile a 32 bit(sempre per Linux):

http://www.filedropper.com/verificalinux32bittar

marco.r
21-01-2013, 08:54
Se fosse possibile avere sistemi di IO ancora più veloci allora il distacco tra versione Java e C probabilmente si amplierebbe ulteriormente.

Sotto linux basta fare una prova su tmpfs (e usare dimensioni di file tali che non si vada a toccare lo swap)

Vincenzo1968
21-01-2013, 09:08
Ciao Marco,

per provare la tua soluzione posso mettere tutti i comandi in un file da lanciare o devo dare i singoli comandi dalla shell?

VICIUS
21-01-2013, 09:21
Effettivamente non vale la pena.

Vicius ha migliorato ma il file prodotto è vuoto: zero byte.

:D

Sarà buggato. Ora non ho tempo di guardarci. Quando ho tempo provo a guardarci.

Vincenzo1968
21-01-2013, 09:27
Quando hai tempo illustra anche il funzionamento di Lucene che cominciamo a preparare il punto B.

Io intanto mi vado a leggere la documentazione di Indri e Zettair.

Vincenzo1968
21-01-2013, 13:08
http://img40.imageshack.us/img40/5753/verificavicius.jpg

http://img824.imageshack.us/img824/3917/verificaanonimovenezian.jpg

http://img210.imageshack.us/img210/8107/verificavincenzo1968.jpg

Ho modificato il programma per la verifica dei file grossi così:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#include <stdint.h>

void PrintHelp(const char *szProg)
{
printf("\nUso: %s NomeFileInput\n", szProg);
}

int main(int argc, char* argv[])
{
FILE *fp;
char szFileName[256];
char * str = NULL;
int k;

if ( argc < 2 )
{
printf("\nUso: verifica NomeFileInput\n");

return -1;
}

str = (char*)malloc(1024*1024);
if ( !str )
{
printf("\nImpossibile allocare la memoria. Addio!\n");
return 0;
}

fp = fopen(argv[1], "r");
if ( fp == NULL )
{
printf("Errore nell'apertura del file %s. Ciao Ciao!\n", argv[1]);
return 0;
}

k = 0;
while (fgets(str, 1024*1024, fp) != NULL)
{
k++;
printf("Riga %d : <%s>\n", k, str);
if ( k > 4 )
break;
}
printf("Ho letto %d stringhe.", k);

free(str);
fclose(fp);

return 0;
}

Vincenzo1968
21-01-2013, 13:45
Io sto cominciando a leggere la documentazione di Zettair per il punto B:

http://www.seg.rmit.edu.au/zettair/index.html

Qualcun altro può occuparsi di Indri e Lucene?

Indri ha il motore in C ma l'interfaccia in Java. Lucene è completamente in Java.

http://lemur.sourceforge.net/indri/
http://www.lemurproject.org/indri.php

http://lucene.apache.org/

Vincenzo1968
21-01-2013, 14:17
Perché mi nega il permesso anche se mi connetto come su?

http://img541.imageshack.us/img541/1042/zettairpermesso.jpg

:confused:

AnonimoVeneziano
21-01-2013, 14:18
Perché mi nega il permesso anche se mi connetto come su?

http://img541.imageshack.us/img541/1042/zettairpermesso.jpg

:confused:

chmod +x configure

Vincenzo1968
21-01-2013, 14:23
chmod +x configure

Grande Anonimo!

:yeah: :winner: :yeah:

Ciao :D

Vincenzo1968
21-01-2013, 14:29
Con make ho questo errore:


fatal error: zlib.h: File o directory non esistente


Come installo zlib? qual è il comando apt-get?

Vincenzo1968
21-01-2013, 14:40
Installati i file per il supporto allo sviluppo di zlib ma adesso ho il seguente errore:


gcc -g -O2 -o mlparse.test src/mlparse_test-mlparse.o src/mlparse_test-str.o src/libtextcodec/mlparse_test-stream.o src/libtextcodec/mlparse_test-gunzipfilter.o src/libtextcodec/mlparse_test-detectfilter.o src/libtextcodec/mlparse_test-crc.o -lm
src/libtextcodec/gunzipfilter.c:393: error: undefined reference to 'inflate'
src/libtextcodec/gunzipfilter.c:440: error: undefined reference to 'inflate'
src/libtextcodec/gunzipfilter.c:468: error: undefined reference to 'inflate'
src/libtextcodec/gunzipfilter.c:567: error: undefined reference to 'inflateEnd'
src/libtextcodec/gunzipfilter.c:595: error: undefined reference to 'inflateInit_'
src/libtextcodec/gunzipfilter.c:598: error: undefined reference to 'inflate'
collect2: error: ld returned 1 exit status
make[1]: *** [mlparse.test] Errore 1
make[1]: *** Attesa per i processi non terminati....
gcc -shared src/.libs/str.o src/.libs/index.o src/.libs/mlparse.o src/.libs/stop.o src/.libs/stop_default.o src/.libs/postings.o src/.libs/merge.o src/.libs/vec.o src/.libs/makeindex.o src/.libs/freemap.o src/.libs/bit.o src/.libs/binsearch.o src/.libs/search.o src/.libs/chash.o src/.libs/stem.o src/.libs/heap.o src/.libs/queryparse.o src/.libs/index_querybuild.o src/.libs/bucket.o src/.libs/mem.o src/.libs/fdset.o src/.libs/pyramid.o src/.libs/iobtree.o src/.libs/getmaxfsize.o src/.libs/storagep.o src/.libs/btbucket.o src/.libs/btbulk.o src/.libs/vocab.o src/.libs/getlongopt.o src/.libs/error.o src/.libs/mlparse_wrap.o src/.libs/summarise.o src/.libs/mime.o src/.libs/remerge.o src/.libs/signals.o src/.libs/stack.o src/.libs/rbtree.o src/.libs/psettings.o src/.libs/psettings_default.o src/.libs/lcrand.o src/.libs/objalloc.o src/.libs/docmap.o src/.libs/reposset.o src/.libs/poolalloc.o src/.libs/alloc.o src/.libs/staticalloc.o src/.libs/dirichlet.o src/.libs/pcosine.o src/.libs/cosine.o src/.libs/hawkapi.o src/.libs/okapi_k3.o src/.libs/impact.o src/.libs/impact_build.o src/libtextcodec/.libs/crc.o src/libtextcodec/.libs/stream.o src/libtextcodec/.libs/detectfilter.o src/libtextcodec/.libs/gunzipfilter.o -lm -Wl,-soname -Wl,libzet.so.0 -o .libs/libzet.so.0.0.0
(cd .libs && rm -f libzet.so.0 && ln -s libzet.so.0.0.0 libzet.so.0)
(cd .libs && rm -f libzet.so && ln -s libzet.so.0.0.0 libzet.so)
ar cru .libs/libzet.a src/str.o src/index.o src/mlparse.o src/stop.o src/stop_default.o src/postings.o src/merge.o src/vec.o src/makeindex.o src/freemap.o src/bit.o src/binsearch.o src/search.o src/chash.o src/stem.o src/heap.o src/queryparse.o src/index_querybuild.o src/bucket.o src/mem.o src/fdset.o src/pyramid.o src/iobtree.o src/getmaxfsize.o src/storagep.o src/btbucket.o src/btbulk.o src/vocab.o src/getlongopt.o src/error.o src/mlparse_wrap.o src/summarise.o src/mime.o src/remerge.o src/signals.o src/stack.o src/rbtree.o src/psettings.o src/psettings_default.o src/lcrand.o src/objalloc.o src/docmap.o src/reposset.o src/poolalloc.o src/alloc.o src/staticalloc.o src/dirichlet.o src/pcosine.o src/cosine.o src/hawkapi.o src/okapi_k3.o src/impact.o src/impact_build.o src/libtextcodec/crc.o src/libtextcodec/stream.o src/libtextcodec/detectfilter.o src/libtextcodec/gunzipfilter.o
ranlib .libs/libzet.a
creating libzet.la
(cd .libs && rm -f libzet.la && ln -s ../libzet.la libzet.la)
make[1]: uscita dalla directory "/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3"
make: *** [all] Errore 2

Vincenzo1968
21-01-2013, 15:03
Ho scaricato i sorgenti di zlib dal sito ufficiale. Installati tramite:


./configure
make -j 2
make install


Installazione tutto ok ma, quando vado per compilare Zettair, ottengo:

vincenzo@Ubuntu12-10-AMD64:~/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3$ make -j 2
make all-am
make[1]: ingresso nella directory "/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3"
/bin/bash ./libtool --mode=link --tag=CC gcc -g -O2 -lm -o zet src/commandline.o -lzet -L. -lm
/bin/bash ./libtool --mode=link --tag=CC gcc -g -O2 -lm -o zet_trec src/trecrun.o src/trec_eval.o -lzet -L. -lm
gcc -g -O2 -o .libs/zet_trec src/trecrun.o src/trec_eval.o /home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so -L/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3 -lm -Wl,--rpath -Wl,/usr/local/lib
gcc -g -O2 -o .libs/zet src/commandline.o /home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so -L/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3 -lm -Wl,--rpath -Wl,/usr/local/lib
/usr/bin//ld:usr/bin/ld: fatal error: .libs/zet_trec: openfatal: Permission denied
errorcollect2: error: ld returned 1 exit status:
.libs/zet: open: Permission denied
collect2: error: ld returned 1 exit status
make[1]: *** [zet_trec] Errore 1
make[1]: *** Attesa per i processi non terminati....
make[1]: *** [zet] Errore 1
make[1]: uscita dalla directory "/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3"
make: *** [all] Errore 2


http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Vincenzo1968
21-01-2013, 15:08
root@Ubuntu12-10-AMD64:/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3# make -j 2
make all-am
make[1]: ingresso nella directory "/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3"
/bin/bash ./libtool --mode=link --tag=CC gcc -g -O2 -lm -o zet src/commandline.o -lzet -L. -lm
/bin/bash ./libtool --mode=link --tag=CC gcc -g -O2 -lm -o zet_trec src/trecrun.o src/trec_eval.o -lzet -L. -lm
gcc -g -O2 -o .libs/zet_trec src/trecrun.o src/trec_eval.o /home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so -L/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3 -lm -Wl,--rpath -Wl,/usr/local/lib
gcc -g -O2 -o .libs/zet src/commandline.o /home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so -L/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3 -lm -Wl,--rpath -Wl,/usr/local/lib
/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so: error: undefined reference to 'inflate'
/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so: error: undefined reference to 'inflateEnd'
/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so: error: undefined reference to 'inflateInit_'
collect2: error: ld returned 1 exit status
make[1]: *** [zet] Errore 1
make[1]: *** Attesa per i processi non terminati....
/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so: error: undefined reference to 'inflate'
/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so: error: undefined reference to 'inflateEnd'
/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3/.libs/libzet.so: error: undefined reference to 'inflateInit_'
collect2: error: ld returned 1 exit status
make[1]: *** [zet_trec] Errore 1
make[1]: uscita dalla directory "/home/vincenzo/Scaricati/TextSearchEngines/Zettair/zettair-0.9.3"
make: *** [all] Errore 2


http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Vincenzo1968
21-01-2013, 15:28
make -lz


http://img545.imageshack.us/img545/6614/zettairinstallato.jpg

http://img252.imageshack.us/img252/3493/zettair.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Ora debbo capire come si usa.

Vincenzo1968
21-01-2013, 15:34
Domani, massimo dopodomani, punto B.

VICIUS
21-01-2013, 15:35
Quando hai tempo illustra anche il funzionamento di Lucene che cominciamo a preparare il punto B.

Io intanto mi vado a leggere la documentazione di Indri e Zettair.

Avrò un paio di settimane piene a lavoro. Non credo che avrò tempo per il resto del contest.

Vincenzo1968
21-01-2013, 15:40
http://img338.imageshack.us/img338/1989/zettairhelp.jpg

Vincenzo1968
21-01-2013, 15:40
Avrò un paio di settimane piene a lavoro. Non credo che avrò tempo per il resto del contest.

Ok. Sambenito ;)

marco.r
21-01-2013, 16:53
Ciao Marco,

per provare la tua soluzione posso mettere tutti i comandi in un file da lanciare o devo dare i singoli comandi dalla shell?

Puoi fare tutto da console, cmq stasera ti preparo un file unico e ti spiego come eseguirlo (e i tool che devi avere installati)

Vincenzo1968
21-01-2013, 17:17
Puoi fare tutto da console, cmq stasera ti preparo un file unico e ti spiego come eseguirlo (e i tool che devi avere installati)

Grazie mille!

Chiedo venia a tutti per la mia niubbaggine su Linux ma come saprete è da pochi giorni che ci sono entrato(nel mondo Linux, dico).

:D

rеpne scasb
21-01-2013, 20:34
Mia versione per il punto A:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mem.h>

#define N_INPUT_FILE 33
#define N_SWAP_PER_ELEMENT 8
#define N_SWAP_RAND_FILE (N_INPUT_FILE*N_SWAP_PER_ELEMENT)
#define MAX_LINE_PER_FILE 65536
#define BUFFER_MB_BLOCK 16
#define BUFFER_OUTPUT_SIZE (BUFFER_MB_BLOCK*1024*1024)

int main(argc,argv)
int argc;
char *argv[];

{
unsigned char **n,*m,*tmp_buffer_output,*buffer_output,*tmp1_buffer,*tmp2_buffer,*tmp3_buffer,*tmp4_buffer,**line_pointer[N_INPUT_FILE],*buffer_input_file[N_INPUT_FILE],*input_file_name[N_INPUT_FILE]={"amor_fa_.txt","bertoldo.txt","candid_t.txt","convivio.txt","dell_art.txt","del_roma.txt","del_tr_t.txt","descartes_discorso_sul_metodo.txt","de_vulga.txt","dialogo_.txt","diario_d.txt","discorsi.txt","don_chis.txt","il_bugia.txt","il_corsa.txt","il_saggi.txt","i_pirati.txt","i_promes.txt","la_banca.txt","la_divin.txt","la_ric_t.txt","la_rivin.txt","la_tigre.txt","le_mecan.txt","le_opere.txt","le_tigri.txt","l_adulat.txt","l_amante.txt","l_avaro.txt","principe.txt","sidereus.txt","storia_d.txt","sulla_or.txt"};
int *o,i,j,k,l,p,n_line_size,last_char,line_file,output_file_size=1,input_file_size[N_INPUT_FILE],*line_size[N_INPUT_FILE],tmp_line_per_file[N_INPUT_FILE],line_per_file[N_INPUT_FILE];
FILE *input_file,*output_file;
time_t t;

printf("CreateTextTestFile - Build 1\n");

if((argc<2)||(argc>3))
{
printf("Use: %s <output_file_name> [optional_size_in_MBytes]",argv[0]);
return 1;
}

if(argc==3)
output_file_size=atoi(argv[2])/BUFFER_MB_BLOCK;

printf("Output file size: %d MiB\n",output_file_size*BUFFER_MB_BLOCK);

if(output_file_size<1)
{
printf("Invalid [optional_size_in_MBytes]\n");
return 1;
}

srand((unsigned)time(&t));

for(i=0;i<N_INPUT_FILE;i++)
{
if((input_file=fopen(input_file_name[i],"rb"))==NULL)
{
printf("Unable to open input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_END))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((input_file_size[i]=ftell(input_file))==-1)
{
printf("Unable to tell input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_SET))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((buffer_input_file[i]=malloc(input_file_size[i]))==NULL)
{
printf("Unable to allocate %d bytes %s\n",input_file_size[i]);
return 1;
}

if((line_size[i]=malloc(MAX_LINE_PER_FILE*sizeof(int)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(int));
return 1;
}

if((line_pointer[i]=malloc(MAX_LINE_PER_FILE*sizeof(char *)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(char *));
return 1;
}

if(fread(buffer_input_file[i],input_file_size[i],1,input_file)==0)
{
printf("Unable to read input file: %s\n",input_file_name[i]);
return 1;
}

if(fclose(input_file)!=NULL)
{
printf("Unable to close input file: %s\n",input_file_name[i]);
return 1;
}
}


for(i=0;i<N_INPUT_FILE;i++)
{
line_file=0;
tmp2_buffer=tmp1_buffer=buffer_input_file[i];
tmp3_buffer=tmp1_buffer+input_file_size[i];

do
{
last_char=n_line_size=0;
tmp4_buffer=tmp2_buffer;
while ((*tmp1_buffer!=0x0A)&&(*tmp1_buffer!=0x0D)&&(tmp1_buffer<tmp3_buffer))
{
if((*tmp1_buffer==0x20)||(*tmp1_buffer==0x09))
{
if(last_char==1)
{
last_char=0;
*tmp2_buffer=0x20;
tmp2_buffer++;
n_line_size++;
}
}
else
{
last_char=1;
*tmp2_buffer=*tmp1_buffer;
tmp2_buffer++;
n_line_size++;
}
tmp1_buffer++;
}

tmp1_buffer++;
if(tmp1_buffer<tmp3_buffer)
{
if((*tmp1_buffer==0x0A)||(*tmp1_buffer==0x0D))
tmp1_buffer++;
}

if(n_line_size)
{
*(unsigned short *)tmp2_buffer=0x0A0D;
tmp2_buffer+=2;
line_size[i][line_file]=n_line_size+2;
line_pointer[i][line_file]=tmp4_buffer;
line_file++;
}

} while (tmp1_buffer<tmp3_buffer);

line_per_file[i]=line_file;
}

if((output_file=fopen(argv[1],"wb"))==NULL)
{
printf("Unable to create output file: %s\n",argv[1]);
return 1;
}

if((buffer_output=malloc(BUFFER_OUTPUT_SIZE))==NULL)
{
printf("Unable to allocate %d bytes %s\n",BUFFER_OUTPUT_SIZE);
return 1;
}

for(i=0;i<N_SWAP_RAND_FILE;i++)
{
j=rand()%N_INPUT_FILE;
k=rand()%N_INPUT_FILE;
l=line_per_file[j];
line_per_file[j]=line_per_file[k];
line_per_file[k]=l;
n=line_pointer[j];
line_pointer[j]=line_pointer[k];
line_pointer[k]=n;
o=line_size[j];
line_size[j]=line_size[k];
line_size[k]=o;
}

for(i=0;i<N_INPUT_FILE;i++)
{

for(j=0;j<(line_per_file[i]*N_SWAP_PER_ELEMENT);j++)
{
k=rand()%line_per_file[i];
l=rand()%line_per_file[i];
m=line_pointer[i][k];
line_pointer[i][k]=line_pointer[i][l];
line_pointer[i][l]=m;
p=line_size[i][k];
line_size[i][k]=line_size[i][l];
line_size[i][l]=p;
}

tmp_line_per_file[i]=0;
}

tmp_buffer_output=buffer_output;
while (1)
{
for(i=0;i<N_INPUT_FILE;i++)
{
k=line_size[i][tmp_line_per_file[i]];
if(tmp_buffer_output+k<(buffer_output+BUFFER_OUTPUT_SIZE))
{
memcpy(tmp_buffer_output,line_pointer[i][tmp_line_per_file[i]],k);

if(*tmp_buffer_output==0x00)
{
return 1;
}

tmp_buffer_output+=k;
}
else
{
j=buffer_output+BUFFER_OUTPUT_SIZE-tmp_buffer_output;
memcpy(tmp_buffer_output,line_pointer[i][tmp_line_per_file[i]],j);

if(fwrite(buffer_output,BUFFER_OUTPUT_SIZE,1,output_file)==0)
{
printf("Unable to write output file: %s\n",argv[1]);
return 1;
}

output_file_size--;
if(output_file_size==0)
break;

tmp_buffer_output=buffer_output;
memcpy(tmp_buffer_output,line_pointer[i][tmp_line_per_file[i]],k-j);
tmp_buffer_output+=k-j;
}

tmp_line_per_file[i]++;
if(tmp_line_per_file[i]==line_per_file[i])
tmp_line_per_file[i]=0;
}

if(output_file_size==0)
break;
}

if(fclose(output_file)!=NULL)
{
printf("Unable to close output file: %s\n",argv[1]);
return 1;
}

for(i=0;i<N_INPUT_FILE;i++)
{
free(buffer_input_file[i]);
free(line_size[i]);
free(line_pointer[i]);
}
free(buffer_output);

return 0;
}

marco.r
21-01-2013, 21:13
Grazie mille!

Chiedo venia a tutti per la mia niubbaggine su Linux ma come saprete è da pochi giorni che ci sono entrato(nel mondo Linux, dico).

:D

Un po' di pazienza e arriva !
Mentre aspetti ti diletto con un po' di testo prodotto da un generatore markoviano partendo dall'insieme di documenti che ci hai indicato tu

amor fa sentire, dove si ecciti la perpendicolare data, lo percorra in un periodo abbastanza recente e che anche il merlo d'america deponga talvolta le sue parti, questo da s�



intermezzo di due o tre variet� di mezzi, imperocch� ogni particolarit�, acquistata che sia, per due o pi� tosto sarebbero nobili; e per esperienza vedemo, discordie e guerre conviene surgere intra regno e regno, le quali crescono in un tempo minore dato. [v. figura 15] cio� ve n'erano due soltanto, ed entrambe abbastanza visibili; le altre specie associate, saranno soggette a modificazioni che non voglia sterminare qualche altra palla d'altra materia, diversa dal legno, si potrebbe continuare questo processo, mentre lascia l'embrione quasi inalterato, aggiunge continuamente nuove differenze generiche, saranno state popolate con mezzi occasionali ed occulti di dispersione, allora

Ipse Dixit ! :mbe: :doh:

Appena sistemo le performance e l'encoding condivido anche il codice di questo...

Vincenzo1968
21-01-2013, 22:05
Un po' di pazienza e arriva !
Mentre aspetti ti diletto con un po' di testo prodotto da un generatore markoviano partendo dall'insieme di documenti che ci hai indicato tu



Ipse Dixit ! :mbe: :doh:

Appena sistemo le performance e l'encoding condivido anche il codice di questo...
Generatore Markoviano. Ho dovuto googlare. E ho trovato questo:

http://uz.sns.it/~fvenez/markov.html

Un generatore markoviano è un programma che genera testi casuali ma vagamente plausibili a partire da un testo di base.


Bello! :D

Potrebbe diventare il punto C :D

marco.r
21-01-2013, 22:29
#!/bin/sh
SIZE=$(echo $2 | sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/;s/$/ +\\/; $a0' | bc)
BS=1000000
COUNT=$(echo 1 + $SIZE / $BS | bc )
OUTPUT=$1
echo > $OUTPUT

cat All/*.txt | sed -e 's/\s+/ /g' | grep -v '^\s*$' > text.dat
while $(test `stat --format '%s' $OUTPUT` -lt $SIZE )
do
shuf text.dat | dd bs=$BS iflag=fullblock count=$COUNT >> $OUTPUT
done
truncate -s $SIZE $OUTPUT

Schiaffa questo codice in un file (e.g. generate.sh) e rendilo eseguibile con

chmod +x generate.sh

per eseguirlo quindi ti basta un

./generate prova.txt 5G

[semi-ot, ma visto che sei ancora alle prime armi...]
nota la prima riga
[code]
#!/bin/sh

Se un eseguibile comincia con i caratteri #! il sistema capisce che si tratta di un file di testo nella cui prima riga e' indicato l'interprete del programma stesso, nel nostro caso /bin/sh, ma puo' esser qualunque cosa.
Ad esempio posso rendere eseguibile uno script python se metto come prima riga

#!/usr/bin/python
print("Hello World\n")

Questo e' differente da windows dove di solito viene controllata l'estensione del file (.exe etc)
[fine ot]


Altra nota:
La versione precedente era divisa in due parti perche' puo' essere comodo generare una sola volta la base di dati e poi generare piu' file in meno tempo.

marco.r
21-01-2013, 22:34
Potrebbe diventare il punto C :D
E' di una semplicita' estrema (nel mio caso 100 righe di codice). Pero' visto che mi sembrava che il primo punto servisse a generare testo da utilizzare per il secondo, un ... punto di vista alternativo potrebbe tornare comodo.

L'importante e' dare una certa varieta' di testi, in modo che il risultato spassoso sia garantito :D

Vincenzo1968
21-01-2013, 22:40
Ok, Marco,

grazie mille per tutto quanto.
Senti, preparalo tu il testo per il punto C. Di File .txt ne trovi a centinaia su LiberLiber.

Domani mattina provo il tuo codice e posto i risultati.

;)

Vincenzo1968
22-01-2013, 09:58
Questi i tempi di Marcor:

Stamattina ho problemi con imageshack: login non valido. M'avranno fregato la password? :mad:

File in output di 5 Gib( ./c19Marcor.sh outMarcor.txt 5G ):

real 1m0.731s
user 0m20.221s
sys 0m34.030s


Sono un po' più elevati dei nostri perché stampa a video ogni passaggio.

@Marco: quando hai il testo del punto C postalo che aggiorno il primo post.

EDIT:

http://img210.imageshack.us/img210/9470/c19outputmarcor.jpg

Vincenzo1968
22-01-2013, 10:48
http://img837.imageshack.us/img837/904/verificamarcor.jpg

C'è qualcosina che non va. Non elimina gli spazi superflui e le righe vuote.

Comunque direi di passare ai punti B e C senza indugiare oltre.

Vincenzo1968
22-01-2013, 11:09
http://img831.imageshack.us/img831/7181/c19puntoc.jpg

Vincenzo1968
22-01-2013, 19:40
http://docs.huihoo.com/zettair/start.html

http://img201.imageshack.us/img201/1061/zettairsearch.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

http://docs.huihoo.com/zettair/

Vincenzo1968
22-01-2013, 20:23
Mia versione per il punto A:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mem.h>

#define N_INPUT_FILE 33
#define N_SWAP_PER_ELEMENT 8
#define N_SWAP_RAND_FILE (N_INPUT_FILE*N_SWAP_PER_ELEMENT)
#define MAX_LINE_PER_FILE 65536
#define BUFFER_MB_BLOCK 16
#define BUFFER_OUTPUT_SIZE (BUFFER_MB_BLOCK*1024*1024)

int main(argc,argv)
int argc;
char *argv[];

{
unsigned char **n,*m,*tmp_buffer_output,*buffer_output,*tmp1_buffer,*tmp2_buffer,*tmp3_buffer,*tmp4_buffer,**line_pointer[N_INPUT_FILE],*buffer_input_file[N_INPUT_FILE],*input_file_name[N_INPUT_FILE]={"amor_fa_.txt","bertoldo.txt","candid_t.txt","convivio.txt","dell_art.txt","del_roma.txt","del_tr_t.txt","descartes_discorso_sul_metodo.txt","de_vulga.txt","dialogo_.txt","diario_d.txt","discorsi.txt","don_chis.txt","il_bugia.txt","il_corsa.txt","il_saggi.txt","i_pirati.txt","i_promes.txt","la_banca.txt","la_divin.txt","la_ric_t.txt","la_rivin.txt","la_tigre.txt","le_mecan.txt","le_opere.txt","le_tigri.txt","l_adulat.txt","l_amante.txt","l_avaro.txt","principe.txt","sidereus.txt","storia_d.txt","sulla_or.txt"};
int *o,i,j,k,l,p,n_line_size,last_char,line_file,output_file_size=1,input_file_size[N_INPUT_FILE],*line_size[N_INPUT_FILE],tmp_line_per_file[N_INPUT_FILE],line_per_file[N_INPUT_FILE];
FILE *input_file,*output_file;
time_t t;

printf("CreateTextTestFile - Build 1\n");

if((argc<2)||(argc>3))
{
printf("Use: %s <output_file_name> [optional_size_in_MBytes]",argv[0]);
return 1;
}

if(argc==3)
output_file_size=atoi(argv[2])/BUFFER_MB_BLOCK;

printf("Output file size: %d MiB\n",output_file_size*BUFFER_MB_BLOCK);

if(output_file_size<1)
{
printf("Invalid [optional_size_in_MBytes]\n");
return 1;
}

srand((unsigned)time(&t));

for(i=0;i<N_INPUT_FILE;i++)
{
if((input_file=fopen(input_file_name[i],"rb"))==NULL)
{
printf("Unable to open input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_END))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((input_file_size[i]=ftell(input_file))==-1)
{
printf("Unable to tell input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_SET))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((buffer_input_file[i]=malloc(input_file_size[i]))==NULL)
{
printf("Unable to allocate %d bytes %s\n",input_file_size[i]);
return 1;
}

if((line_size[i]=malloc(MAX_LINE_PER_FILE*sizeof(int)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(int));
return 1;
}

if((line_pointer[i]=malloc(MAX_LINE_PER_FILE*sizeof(char *)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(char *));
return 1;
}

if(fread(buffer_input_file[i],input_file_size[i],1,input_file)==0)
{
printf("Unable to read input file: %s\n",input_file_name[i]);
return 1;
}

if(fclose(input_file)!=NULL)
{
printf("Unable to close input file: %s\n",input_file_name[i]);
return 1;
}
}


for(i=0;i<N_INPUT_FILE;i++)
{
line_file=0;
tmp2_buffer=tmp1_buffer=buffer_input_file[i];
tmp3_buffer=tmp1_buffer+input_file_size[i];

do
{
last_char=n_line_size=0;
tmp4_buffer=tmp2_buffer;
while ((*tmp1_buffer!=0x0A)&&(*tmp1_buffer!=0x0D)&&(tmp1_buffer<tmp3_buffer))
{
if((*tmp1_buffer==0x20)||(*tmp1_buffer==0x09))
{
if(last_char==1)
{
last_char=0;
*tmp2_buffer=0x20;
tmp2_buffer++;
n_line_size++;
}
}
else
{
last_char=1;
*tmp2_buffer=*tmp1_buffer;
tmp2_buffer++;
n_line_size++;
}
tmp1_buffer++;
}

tmp1_buffer++;
if(tmp1_buffer<tmp3_buffer)
{
if((*tmp1_buffer==0x0A)||(*tmp1_buffer==0x0D))
tmp1_buffer++;
}

if(n_line_size)
{
*(unsigned short *)tmp2_buffer=0x0A0D;
tmp2_buffer+=2;
line_size[i][line_file]=n_line_size+2;
line_pointer[i][line_file]=tmp4_buffer;
line_file++;
}

} while (tmp1_buffer<tmp3_buffer);

line_per_file[i]=line_file;
}

if((output_file=fopen(argv[1],"wb"))==NULL)
{
printf("Unable to create output file: %s\n",argv[1]);
return 1;
}

if((buffer_output=malloc(BUFFER_OUTPUT_SIZE))==NULL)
{
printf("Unable to allocate %d bytes %s\n",BUFFER_OUTPUT_SIZE);
return 1;
}

for(i=0;i<N_SWAP_RAND_FILE;i++)
{
j=rand()%N_INPUT_FILE;
k=rand()%N_INPUT_FILE;
l=line_per_file[j];
line_per_file[j]=line_per_file[k];
line_per_file[k]=l;
n=line_pointer[j];
line_pointer[j]=line_pointer[k];
line_pointer[k]=n;
o=line_size[j];
line_size[j]=line_size[k];
line_size[k]=o;
}

for(i=0;i<N_INPUT_FILE;i++)
{

for(j=0;j<(line_per_file[i]*N_SWAP_PER_ELEMENT);j++)
{
k=rand()%line_per_file[i];
l=rand()%line_per_file[i];
m=line_pointer[i][k];
line_pointer[i][k]=line_pointer[i][l];
line_pointer[i][l]=m;
p=line_size[i][k];
line_size[i][k]=line_size[i][l];
line_size[i][l]=p;
}

tmp_line_per_file[i]=0;
}

tmp_buffer_output=buffer_output;
while (1)
{
for(i=0;i<N_INPUT_FILE;i++)
{
k=line_size[i][tmp_line_per_file[i]];
if(tmp_buffer_output+k<(buffer_output+BUFFER_OUTPUT_SIZE))
{
memcpy(tmp_buffer_output,line_pointer[i][tmp_line_per_file[i]],k);

if(*tmp_buffer_output==0x00)
{
return 1;
}

tmp_buffer_output+=k;
}
else
{
j=buffer_output+BUFFER_OUTPUT_SIZE-tmp_buffer_output;
memcpy(tmp_buffer_output,line_pointer[i][tmp_line_per_file[i]],j);

if(fwrite(buffer_output,BUFFER_OUTPUT_SIZE,1,output_file)==0)
{
printf("Unable to write output file: %s\n",argv[1]);
return 1;
}

output_file_size--;
if(output_file_size==0)
break;

tmp_buffer_output=buffer_output;
memcpy(tmp_buffer_output,line_pointer[i][tmp_line_per_file[i]],k-j);
tmp_buffer_output+=k-j;
}

tmp_line_per_file[i]++;
if(tmp_line_per_file[i]==line_per_file[i])
tmp_line_per_file[i]=0;
}

if(output_file_size==0)
break;
}

if(fclose(output_file)!=NULL)
{
printf("Unable to close output file: %s\n",argv[1]);
return 1;
}

for(i=0;i<N_INPUT_FILE;i++)
{
free(buffer_input_file[i]);
free(line_size[i]);
free(line_pointer[i]);
}
free(buffer_output);

return 0;
}


Minchia mi ero perso questo post! Ma come ca... ho fatto?
Meno male che ho deciso di rileggermi l'intero thread.

Repne scusami!

Provo immediatamente il tuo codice e posto i risultati.
Ciao :D

Vincenzo1968
22-01-2013, 20:43
http://img16.imageshack.us/img16/9799/outrepne.jpg

:D

Vincenzo1968
22-01-2013, 20:47
http://img688.imageshack.us/img688/9278/verificarepne.jpg

Repne, per compilare su Linux con GCC ho dovuto modificare questa riga:


#include <mem.h>


così:


#include <malloc.h>

rеpne scasb
22-01-2013, 20:54
http://img688.imageshack.us/img688/9278/verificarepne.jpg

Repne, per compilare su Linux con GCC ho dovuto modificare questa riga:


#include <mem.h>


così:


#include <malloc.h>


Provvedo a modificare. Sul mio sistema la creazione di un file di output da 5 Gb~ viene portata a termine in 4.219 secondi (misurato to Windows con PTIME.EXE).

Vincenzo1968
22-01-2013, 20:56
Provvedo a modificare. Sul mio sistema la creazione di un file di output da 5000 Gb~ viene portata a termine in 4.219 secondi (misurato sotto Windows con PTIME.EXE).

PTIME.EXE? È un file standard di Windows ho debbo scaricarlo da qualche parte?

rеpne scasb
22-01-2013, 21:02
PTIME.EXE? È un file standard di Windows ho debbo scaricarlo da qualche parte?

Te lo allego.

Vincenzo1968
22-01-2013, 21:18
Grazie mille!

Domani prendo i tempi di tutti su Windows 8 a 64 bit.

rеpne scasb
22-01-2013, 21:19
Prova questo, su alcuni PC potrebbe essere più veloce:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <mem.h>

#define N_INPUT_FILE 33
#define N_SWAP_PER_ELEMENT 8
#define N_SWAP_RAND_FILE (N_INPUT_FILE*N_SWAP_PER_ELEMENT)
#define MAX_LINE_PER_FILE 65536
#define BUFFER_MB_BLOCK 16
#define BUFFER_OUTPUT_SIZE (BUFFER_MB_BLOCK*1024*1024)

int main(argc,argv)
int argc;
char *argv[];

{
unsigned char **n,*m,*tmp_buffer_output,*buffer_output,*tmp1_buffer,*tmp2_buffer,*tmp3_buffer,*tmp4_buffer,**line_pointer[N_INPUT_FILE],*buffer_input_file[N_INPUT_FILE],*input_file_name[N_INPUT_FILE]={"amor_fa_.txt","bertoldo.txt","candid_t.txt","convivio.txt","dell_art.txt","del_roma.txt","del_tr_t.txt","descartes_discorso_sul_metodo.txt","de_vulga.txt","dialogo_.txt","diario_d.txt","discorsi.txt","don_chis.txt","il_bugia.txt","il_corsa.txt","il_saggi.txt","i_pirati.txt","i_promes.txt","la_banca.txt","la_divin.txt","la_ric_t.txt","la_rivin.txt","la_tigre.txt","le_mecan.txt","le_opere.txt","le_tigri.txt","l_adulat.txt","l_amante.txt","l_avaro.txt","principe.txt","sidereus.txt","storia_d.txt","sulla_or.txt"};
int *o,i,j,k,l,p,n_line_size,last_char,line_file,output_file_size=1,input_file_size[N_INPUT_FILE],*line_size[N_INPUT_FILE],tmp_line_per_file[N_INPUT_FILE],line_per_file[N_INPUT_FILE];
FILE *input_file,*output_file;
time_t t;

printf("CreateTextTestFile - Build 2\n");

if((argc<2)||(argc>3))
{
printf("Use: %s <output_file_name> [optional_size_in_MBytes]",argv[0]);
return 1;
}

if(argc==3)
output_file_size=atoi(argv[2])/BUFFER_MB_BLOCK;

printf("Output file size: %d MiB\n",output_file_size*BUFFER_MB_BLOCK);

if(output_file_size<1)
{
printf("Invalid [optional_size_in_MBytes]\n");
return 1;
}

srand((unsigned)time(&t));

for(i=0;i<N_INPUT_FILE;i++)
{
if((input_file=fopen(input_file_name[i],"rb"))==NULL)
{
printf("Unable to open input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_END))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((input_file_size[i]=ftell(input_file))==-1)
{
printf("Unable to tell input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_SET))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((buffer_input_file[i]=malloc(input_file_size[i]))==NULL)
{
printf("Unable to allocate %d bytes %s\n",input_file_size[i]);
return 1;
}

if((line_size[i]=malloc(MAX_LINE_PER_FILE*sizeof(int)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(int));
return 1;
}

if((line_pointer[i]=malloc(MAX_LINE_PER_FILE*sizeof(char *)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(char *));
return 1;
}

if(fread(buffer_input_file[i],input_file_size[i],1,input_file)==0)
{
printf("Unable to read input file: %s\n",input_file_name[i]);
return 1;
}

if(fclose(input_file)!=NULL)
{
printf("Unable to close input file: %s\n",input_file_name[i]);
return 1;
}
}


for(i=0;i<N_INPUT_FILE;i++)
{
line_file=0;
tmp2_buffer=tmp1_buffer=buffer_input_file[i];
tmp3_buffer=tmp1_buffer+input_file_size[i];

do
{
last_char=n_line_size=0;
tmp4_buffer=tmp2_buffer;
while ((*tmp1_buffer!=0x0A)&&(*tmp1_buffer!=0x0D)&&(tmp1_buffer<tmp3_buffer))
{
if((*tmp1_buffer==0x20)||(*tmp1_buffer==0x09))
{
if(last_char==1)
{
last_char=0;
*tmp2_buffer=0x20;
tmp2_buffer++;
n_line_size++;
}
}
else
{
last_char=1;
*tmp2_buffer=*tmp1_buffer;
tmp2_buffer++;
n_line_size++;
}
tmp1_buffer++;
}

tmp1_buffer++;
if(tmp1_buffer<tmp3_buffer)
{
if((*tmp1_buffer==0x0A)||(*tmp1_buffer==0x0D))
tmp1_buffer++;
}

if(n_line_size)
{
*(unsigned short *)tmp2_buffer=0x0A0D;
tmp2_buffer+=2;
line_size[i][line_file]=n_line_size+2;
line_pointer[i][line_file]=tmp4_buffer;
line_file++;
}

} while (tmp1_buffer<tmp3_buffer);

line_per_file[i]=line_file;
}

if((output_file=fopen(argv[1],"wb"))==NULL)
{
printf("Unable to create output file: %s\n",argv[1]);
return 1;
}

if((buffer_output=malloc(BUFFER_OUTPUT_SIZE))==NULL)
{
printf("Unable to allocate %d bytes %s\n",BUFFER_OUTPUT_SIZE);
return 1;
}

for(i=0;i<N_SWAP_RAND_FILE;i++)
{
j=rand()%N_INPUT_FILE;
k=rand()%N_INPUT_FILE;
l=line_per_file[j];
line_per_file[j]=line_per_file[k];
line_per_file[k]=l;
n=line_pointer[j];
line_pointer[j]=line_pointer[k];
line_pointer[k]=n;
o=line_size[j];
line_size[j]=line_size[k];
line_size[k]=o;
}

for(i=0;i<N_INPUT_FILE;i++)
{

for(j=0;j<(line_per_file[i]*N_SWAP_PER_ELEMENT);j++)
{
k=rand()%line_per_file[i];
l=rand()%line_per_file[i];
m=line_pointer[i][k];
line_pointer[i][k]=line_pointer[i][l];
line_pointer[i][l]=m;
p=line_size[i][k];
line_size[i][k]=line_size[i][l];
line_size[i][l]=p;
}

tmp_line_per_file[i]=0;
}

tmp_buffer_output=buffer_output;
while (1)
{
for(i=0;i<N_INPUT_FILE;i++)
{
k=line_size[i][tmp_line_per_file[i]];
if(tmp_buffer_output+k<(buffer_output+BUFFER_OUTPUT_SIZE))
{
fwrite(line_pointer[i][tmp_line_per_file[i]],k,1,output_file);

tmp_buffer_output+=k;
}
else
{
j=buffer_output+BUFFER_OUTPUT_SIZE-tmp_buffer_output;
fwrite(line_pointer[i][tmp_line_per_file[i]],j,1,output_file);

output_file_size--;
if(output_file_size==0)
break;

tmp_buffer_output=buffer_output;

fwrite(line_pointer[i][tmp_line_per_file[i]],k-j,1,output_file);

tmp_buffer_output+=k-j;
}

tmp_line_per_file[i]++;
if(tmp_line_per_file[i]==line_per_file[i])
tmp_line_per_file[i]=0;
}

if(output_file_size==0)
break;
}

if(fclose(output_file)!=NULL)
{
printf("Unable to close output file: %s\n",argv[1]);
return 1;
}

for(i=0;i<N_INPUT_FILE;i++)
{
free(buffer_input_file[i]);
free(line_size[i]);
free(line_pointer[i]);
}
free(buffer_output);

return 0;
}

Vincenzo1968
22-01-2013, 21:29
Ok, domani provo entrambe le versioni(sia su Linux che su Windows 32/64 bit).

Buonanotte ;)

Vincenzo1968
23-01-2013, 09:57
Per il momento non ho Windows 8 a disposizione. Stasera faccio le prove e posto i risultati.

Direi di passare al punto B. Che dite?

Il punto B è questo:


B.1:
Si realizzi un programmino che, data in input una stringa di ricerca, indichi l'esatta posizione (riga e colonna) nel file creato al punto A.

Si prendano separatamente i tempi per la creazione dell'indice e quelli per la ricerca.

Se volete utilizzare un algoritmo brute force, senza creare l'indice, siete liberi di farlo.

Vincenzo1968
23-01-2013, 11:03
Questi i tempi di Zettair per creare un indice su un file di 1 GiB:

http://img171.imageshack.us/img171/6671/tempicreateindexzettair.jpg

Vincenzo1968
23-01-2013, 11:25
Esempio:


Questo è un esempio.
Anche questo è un esempio.
E pure questa riga costituisce un esempio.


Queri : "esempio"

L'output sarà:


"esempio": trovate 3 occorrenze:
- riga 1 colonna 13
- riga 2 colonna 19
- riga 3 colonna 35


Query: "anche"
Output:

"anche": trovata 1 occorrenza:
- riga 2 colonna 1


Query: "isola":
Output:

"isola": non ho trovato un bel niente.


EDIT: dimenticavo: inserite un parametro da riga di comando per specificare se la ricerca deve essere case-sensitive o no.
Specificando, per esempio, il parametro --case-sensitive, il secondo esempio deve restituire:

"anche": non ho trovato un bel niente.

Di default, se non viene specificato il parametro da riga di comando, si utilizzerà la ricerca case-insensitive.

VICIUS
23-01-2013, 14:05
Generate.java (http://cl.ly/MNEp)

Le righe vuote non venivano cancellate perché hai fatto i file di testo su windows ed ovviamente li newline è cr+lf sui sistemi di mamma ms.

Vincenzo1968
23-01-2013, 14:20
Generate.java (http://cl.ly/MNEp)

Le righe vuote non venivano cancellate perché hai fatto i file di testo su windows ed ovviamente li newline è cr+lf sui sistemi di mamma ms.

Non li ho fatti io i file di testo. Li ho scaricati da LiberLiber.
Pure 'sta camurria dei newline nei file di testo adesso...
Ma non si possono mettere d'accordo su una cosa almeno? Le linee dei file di testo vanno specificate con LF. Punto e basta.
Invece no. Su Windows CR+LF. Su Linux LF.

EDIT: (vedi più sotto) e su Mac CR!

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

Vincenzo1968
23-01-2013, 14:29
http://img202.imageshack.us/img202/9177/c19viciusnew.jpg

La versione Java di Vicius eguaglia, come tempi, le versioni in C.
Confermo la mia favorevole impressione su Java per questo contest(almeno per il punto A; ma mo viene il bello: i punti B e C :D )

;)

cdimauro
23-01-2013, 14:35
Non li ho fatti io i file di testo. Li ho scaricati da LiberLiber.
Pure 'sta camurria dei newline nei file di testo adesso...
Ma non si possono mettere d'accordo su una cosa almeno? Le linee dei file di testo vanno specificate con LF. Punto e basta.
Invece no. Su Windows CR+LF. Su Linux LF.
LF, CR o CR + LF: qual è lo “standard” per i file di testo? (http://www.appuntidigitali.it/4581/lf-cr-o-cr-lf-qual-e-lo-standard-per-i-file-di-testo/)

Vincenzo1968
23-01-2013, 14:53
LF, CR o CR + LF: qual è lo “standard” per i file di testo? (http://www.appuntidigitali.it/4581/lf-cr-o-cr-lf-qual-e-lo-standard-per-i-file-di-testo/)

Nientedimeno su Mac è diverso dai primi due. Che casino!


Furono i s.o. a far sprofondare nel caos la situazione. Alcuni, come Unix e AmigaOS, adottarono il solo LF; altri, come i Pet di Commodore e MacOS, il solo CR; altri ancora, come CP/M ed MS-DOS, l’accoppiata CR + LR.


http://www.hwupgrade.org/public/style_emoticons/default/rage.png

cdimauro
23-01-2013, 15:29
Apple si deve far riconoscere sempre. Think different... :rolleyes:

Vincenzo1968
23-01-2013, 15:37
Generate.java (http://cl.ly/MNEp)

Le righe vuote non venivano cancellate perché hai fatto i file di testo su windows ed ovviamente li newline è cr+lf sui sistemi di mamma ms.

Comunque se tu avessi utilizzato il C non avresti avuto problemi: "\n" e buonanotte. :D


Scheeeeeeerrrrzoooooo! Non cominciamo una guerra sui vari linguaggi, per carità(di Dio).

:D

Vincenzo1968
23-01-2013, 15:53
I tempi delle due versioni di Repne sulla mia macchina Linux:

http://img46.imageshack.us/img46/3695/tempirepnelinux.png

Con la calcolatrice ho fatto: 1024 x 5 = 5120.

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Repne, mi sono permesso di modificare il tuo codice in modo da fargli leggeri i file nella sottodirectory All piuttosto che nella directory corrente:


unsigned char **n,*m,*tmp_buffer_output,*buffer_output,*tmp1_buffer,*tmp2_buffer,*tmp3_buffer,*tmp4_buffer,**line_pointer[N_INPUT_FILE],*buffer_input_file[N_INPUT_FILE],*input_file_name[N_INPUT_FILE]=
{"All/amor_fa_.txt", "All/bertoldo.txt","All/candid_t.txt","All/convivio.txt","All/dell_art.txt","All/del_roma.txt","All/del_tr_t.txt","All/descartes_discorso_sul_metodo.txt","All/de_vulga.txt","All/dialogo_.txt","All/diario_d.txt","All/discorsi.txt","All/don_chis.txt","All/il_bugia.txt","All/il_corsa.txt","All/il_saggi.txt","All/i_pirati.txt","All/i_promes.txt","All/la_banca.txt","All/la_divin.txt","All/la_ric_t.txt","All/la_rivin.txt","All/la_tigre.txt","All/le_mecan.txt","All/le_opere.txt","All/le_tigri.txt","All/l_adulat.txt","All/l_amante.txt","All/l_avaro.txt","All/principe.txt","All/sidereus.txt","All/storia_d.txt","All/sulla_or.txt"};
//{"amor_fa_.txt","bertoldo.txt","candid_t.txt","convivio.txt","dell_art.txt","del_roma.txt","del_tr_t.txt","descartes_discorso_sul_metodo.txt","de_vulga.txt","dialogo_.txt","diario_d.txt","discorsi.txt","don_chis.txt","il_bugia.txt","il_corsa.txt","il_saggi.txt","i_pirati.txt","i_promes.txt","la_banca.txt","la_divin.txt","la_ric_t.txt","la_rivin.txt","la_tigre.txt","le_mecan.txt","le_opere.txt","le_tigri.txt","l_adulat.txt","l_amante.txt","l_avaro.txt","principe.txt","sidereus.txt","storia_d.txt","sulla_or.txt"};

Vincenzo1968
23-01-2013, 16:36
Dunque il primo round se lo aggiudica Repne. Di poco, ma se lo aggiudica.
Ho considerato i tempi real: 27 secondi circa contro i 29-30 di tutti gli altri.

Adesso vado a fare i test su Windows 8 a 64 bit e posto i risultati.

Dopodiché passiamo definitivamente al punto B.

;)

Vincenzo1968
23-01-2013, 17:34
Su Windows 8 a 64 bit stravince Repne con la sua prima versione. Ci mette soltanto 35 secondi contro i circa 90 della seconda.
Anche tutti gli altri(compreso Vicius con Java) impiegano circa 90 secondi.

I tempi sono stati misurati con ptime.exe

Il compilatore utilizzato è Visual Studio 2012. Ho ovviamente compilato tutti i programmi a 64 bit in modalità Release e con l'opzione -O2.

Non ditemi di postare gli screenshot perché mi stanno partendo gli occhi. Tra l'altro ho voluto provare pure con GCC per Windows e i tempi non cambiano.
Se non mi credete fateli da voi sulla vostra macchina i benchmarch(anzi, sarebbe meglio averne diversi, di benchmarch dico,e su diverse macchine).

;)

AnonimoVeneziano
23-01-2013, 17:57
C'e' un problema pero'

Hai testato la versione di Repne con 5000 MB, mentre la nostra e' espressa in GB.

Dovresti provare la versione di Repne (per correttezza) con 5120 MB :p

rеpne scasb
23-01-2013, 18:06
Ho anche una terza versione ma credo cambi poco. L'I/O fa da anello debole.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <mem.h>

#define N_INPUT_FILE 33
#define N_SWAP_PER_ELEMENT 8
#define N_SWAP_RAND_FILE (N_INPUT_FILE*N_SWAP_PER_ELEMENT)
#define MAX_LINE_PER_FILE 65536

int main(argc,argv)
int argc;
char *argv[];

{
unsigned char **n,*m,*tmp1_buffer,*tmp2_buffer,*tmp3_buffer,*tmp4_buffer,**line_pointer[N_INPUT_FILE],*buffer_input_file[N_INPUT_FILE],*input_file_name[N_INPUT_FILE]={"amor_fa_.txt","bertoldo.txt","candid_t.txt","convivio.txt","dell_art.txt","del_roma.txt","del_tr_t.txt","descartes_discorso_sul_metodo.txt","de_vulga.txt","dialogo_.txt","diario_d.txt","discorsi.txt","don_chis.txt","il_bugia.txt","il_corsa.txt","il_saggi.txt","i_pirati.txt","i_promes.txt","la_banca.txt","la_divin.txt","la_ric_t.txt","la_rivin.txt","la_tigre.txt","le_mecan.txt","le_opere.txt","le_tigri.txt","l_adulat.txt","l_amante.txt","l_avaro.txt","principe.txt","sidereus.txt","storia_d.txt","sulla_or.txt"};
int *o,i,j,k,l,p,n_line_size,last_char,line_file,output_file_size=1,input_file_size[N_INPUT_FILE],*line_size[N_INPUT_FILE],tmp_line_per_file[N_INPUT_FILE],line_per_file[N_INPUT_FILE];
FILE *input_file,*output_file;
unsigned long long q,r=0;
time_t t;

printf("CreateTextTestFile - Build 3\n");

if((argc<2)||(argc>3))
{
printf("Use: %s <output_file_name> [optional_size_in_MBytes]",argv[0]);
return 1;
}

if(argc==3)
output_file_size=atoi(argv[2]);

printf("Output file size: %d MB\n",output_file_size);

if(output_file_size<1)
{
printf("Invalid [optional_size_in_MBytes]\n");
return 1;
}

q=(unsigned long long)output_file_size*1000000;

srand((unsigned)time(&t));

for(i=0;i<N_INPUT_FILE;i++)
{
if((input_file=fopen(input_file_name[i],"rb"))==NULL)
{
printf("Unable to open input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_END))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((input_file_size[i]=ftell(input_file))==-1)
{
printf("Unable to tell input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_SET))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((buffer_input_file[i]=malloc(input_file_size[i]))==NULL)
{
printf("Unable to allocate %d bytes %s\n",input_file_size[i]);
return 1;
}

if((line_size[i]=malloc(MAX_LINE_PER_FILE*sizeof(int)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(int));
return 1;
}

if((line_pointer[i]=malloc(MAX_LINE_PER_FILE*sizeof(char *)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(char *));
return 1;
}

if(fread(buffer_input_file[i],input_file_size[i],1,input_file)==0)
{
printf("Unable to read input file: %s\n",input_file_name[i]);
return 1;
}

if(fclose(input_file)!=NULL)
{
printf("Unable to close input file: %s\n",input_file_name[i]);
return 1;
}
}


for(i=0;i<N_INPUT_FILE;i++)
{
line_file=0;
tmp2_buffer=tmp1_buffer=buffer_input_file[i];
tmp3_buffer=tmp1_buffer+input_file_size[i];

do
{
last_char=n_line_size=0;
tmp4_buffer=tmp2_buffer;
while ((*tmp1_buffer!=0x0A)&&(*tmp1_buffer!=0x0D)&&(tmp1_buffer<tmp3_buffer))
{
if((*tmp1_buffer==0x20)||(*tmp1_buffer==0x09))
{
if(last_char==1)
{
last_char=0;
*tmp2_buffer=0x20;
tmp2_buffer++;
n_line_size++;
}
}
else
{
last_char=1;
*tmp2_buffer=*tmp1_buffer;
tmp2_buffer++;
n_line_size++;
}
tmp1_buffer++;
}

tmp1_buffer++;
if(tmp1_buffer<tmp3_buffer)
{
if((*tmp1_buffer==0x0A)||(*tmp1_buffer==0x0D))
tmp1_buffer++;
}

if(n_line_size)
{
*(unsigned short *)tmp2_buffer=0x0A0D;
tmp2_buffer+=2;
line_size[i][line_file]=n_line_size+2;
line_pointer[i][line_file]=tmp4_buffer;
line_file++;
}

} while (tmp1_buffer<tmp3_buffer);

line_per_file[i]=line_file;
}

if((output_file=fopen(argv[1],"wb"))==NULL)
{
printf("Unable to create output file: %s\n",argv[1]);
return 1;
}

for(i=0;i<N_SWAP_RAND_FILE;i++)
{
j=rand()%N_INPUT_FILE;
k=rand()%N_INPUT_FILE;
l=line_per_file[j];
line_per_file[j]=line_per_file[k];
line_per_file[k]=l;
n=line_pointer[j];
line_pointer[j]=line_pointer[k];
line_pointer[k]=n;
o=line_size[j];
line_size[j]=line_size[k];
line_size[k]=o;
}

for(i=0;i<N_INPUT_FILE;i++)
{

for(j=0;j<(line_per_file[i]*N_SWAP_PER_ELEMENT);j++)
{
k=rand()%line_per_file[i];
l=rand()%line_per_file[i];
m=line_pointer[i][k];
line_pointer[i][k]=line_pointer[i][l];
line_pointer[i][l]=m;
p=line_size[i][k];
line_size[i][k]=line_size[i][l];
line_size[i][l]=p;
}

tmp_line_per_file[i]=0;
}

k=i=0;
while (r<q)
{
k=line_size[i][tmp_line_per_file[i]];
fwrite(line_pointer[i][tmp_line_per_file[i]],k,1,output_file);
r+=k;

tmp_line_per_file[i]++;
if(tmp_line_per_file[i]==line_per_file[i])
tmp_line_per_file[i]=0;

i++;
if(i==N_INPUT_FILE)
i=0;
}

if(fclose(output_file)!=NULL)
{
printf("Unable to close output file: %s\n",argv[1]);
return 1;
}

for(i=0;i<N_INPUT_FILE;i++)
{
free(buffer_input_file[i]);
free(line_size[i]);
free(line_pointer[i]);
}

return 0;
}

rеpne scasb
23-01-2013, 18:07
C'e' un problema pero'

Hai testato la versione di Repne con 5000 MB, mentre la nostra e' espressa in GB.

Dovresti provare la versione di Repne (per correttezza) con 5120 MB :p

Non vorrei sbagliarmi, ma credo fosse questo il motivo dell'uso della calcolatrice di Ubuntu.

AnonimoVeneziano
23-01-2013, 18:16
Non vorrei sbagliarmi, ma credo fosse questo il motivo dell'uso della calcolatrice di Ubuntu.

Ah ok, ero rimasto al test alla pagina precedente.

Vincenzo1968
23-01-2013, 18:20
C'e' un problema pero'

Hai testato la versione di Repne con 5000 MB, mentre la nostra e' espressa in GB.

Dovresti provare la versione di Repne (per correttezza) con 5120 MB :p

Si si, così ho fatto. Guarda un po' più sopra.
Ho usato la calcolatrice: 1024 x 5 :D

Vincenzo1968
23-01-2013, 18:24
Ho anche una terza versione ma credo cambi poco. L'I/O fa da anello debole.
...


Sono stanco morto. Sembra una cavolata ma compilare i programmi di tutti e fare i test ti stanca moltissimo.
Copincollato il tuo codice ma lo provo domani. :D

Intanto diamoci da fare per il punto B. Leggete il primo post.

;)

EDIT: anzi no, ve lo riporto qui:

Punto B:
Da definire più in la. Ci occuperemo degli algoritmi per la Full Text Seach (http://en.wikipedia.org/wiki/Full_text_search) e confronteremo le prestazioni(e la qualità dei risultati) con alcuni programmi che vanno per la maggiore nel settore: Lucene (http://lucene.apache.org/), Zettair (http://www.seg.rmit.edu.au/zettair/index.html), Indri (http://www.lemurproject.org/indri.php).
EDIT: Punto B.1:

B.1:
Si realizzi un programmino che, data in input una stringa di ricerca, indichi l'esatta posizione (riga e colonna) nel file creato al punto A.

Si prendano separatamente i tempi per la creazione dell'indice e quelli per la ricerca.

Se volete utilizzare un algoritmo brute force, senza creare l'indice, siete liberi di farlo.

B.2: da definire.

B.3: da definire.

L'esempio qui: http://www.hwupgrade.it/forum/showpost.php?p=38906339&postcount=180

E, a cura dell'utente Marco.r:
Punto C:
Catene Markoviane. In preparazione.
;)

Vincenzo1968
23-01-2013, 18:35
Però vorrei capire una cosa: come mai nella macchina con Windows 8 il codice C risulta più lento rispetto alla macchina con Linux?
Eppure il processore è più potente(su Windows 8). Di chi è il merito? Di GCC che ottimizza meglio di Visual Studio? Del disco fisso più veloce?

Ma anche la versione Java gira più lenta(circa tre volte) rispetto a quella su Linux. Quindi, se non è il disco fisso, GCC non dovrebbe entrarci. Potrebbe essere merito di Linux?
O magari è merito di entrambi: e GCC e Linux: in fondo la JVM è compilata con GCC su Linux, o no?

:confused:

EDIT: E poi su Windows 8 ho compilato anche con GCC per Windows e l'algoritmo per la generazione e l'ottimizzazione dell'assembly dovrebbe essere uguale a quello di GCC per Linux(aaturalmente cambia il formato del file prodotto PE/ELF).

Boh!
:confused:

Vincenzo1968
23-01-2013, 18:47
http://img685.imageshack.us/img685/6105/macchinalinux.jpg


----------------------------------------------------------------------------------------------------------------------------------------------------------------


http://img545.imageshack.us/img545/5976/macchinanuova.jpg

:read:

clockover
23-01-2013, 18:57
Non riesco scaricare i files di input... dove posso trovarli?

Vincenzo1968
23-01-2013, 19:08
Non riesco scaricare i files di input... dove posso trovarli?

Ho aggiornato il primo post. Scaricali da qui:

http://www.filedropper.com/alltar

In formato .zip:
http://www.filedropper.com/all_1

Ma che è? Su fie dropper li tengono solo per pochi giorni? Non c'è un sito più duraturo per l'upload dei file?

:confused:

Vincenzo1968
23-01-2013, 19:22
Prova qui, in formato zip:

http://www.filedropper.com/all_1

clockover
23-01-2013, 19:44
Prova qui, in formato zip:

http://www.filedropper.com/all_1

Da qui totto ok grazie :)

rеpne scasb
23-01-2013, 19:46
Però vorrei capire una cosa: come mai nella macchina con Windows 8 il codice C risulta più lento rispetto alla macchina con Linux?...[CUT]

Hard-disk (marca e modello) sia sulla macchina Linux che su quella Windows?

Vincenzo1968
23-01-2013, 20:54
Hard-disk (marca e modello) sia sulla macchina Linux che su quella Windows?

Ora vedo. Se non trovo il manuale come faccio via api sia su Windows che su Linux a vedere le caratteristiche del disco?(la domanda è rivolta a tutti).

Ci dovrebbe essere qualche api del tipo GetSystemInfo e simili.

Intanto sto facendo i bookmark nel portatilino con Windows 8 a 32 bit.

;)

Vincenzo1968
23-01-2013, 21:32
I tempi sul portatilino con Windows 8 a 32 bit:

------------------------------------------------------------------------------------------------------------------
C:\Contest19\Exe>ptime AnonimoVeneziano1 output.txt -D500MB

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

=== AnonimoVeneziano1 output.txt -D500MB ===
Started loading the files
Files loaded, it took: 0.094000 seconds

Started processing the files
File processing finished, it took: 0.188000 seconds

Started final file output
Final file output finished, it took: 7.431000 seconds

Execution time: 8.069 s
------------------------------------------------------------------------------------------------------------------
C:\Contest19\Exe>ptime AnonimoVeneziano2 output.txt -D500MB

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

=== AnonimoVeneziano2 output.txt -D500MB ===
Started loading the files
Files loaded, it took: 0.092000 seconds

Started processing the files
File processing finished, it took: 0.189000 seconds

Started final file output
Final file output finished, it took: 17.464001 seconds

Execution time: 18.383 s

C:\Contest19\Exe>
------------------------------------------------------------------------------------------------------------------

C:\Contest19\Exe>ptime Vincenzo1968 output.txt -D500MB

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

=== Vincenzo1968 output.txt -D500MB ===

Elaborazione del file output.txt in corso.
Attendere prego...

Tempo impiegato per lettura dati -> 0.03200 secondi

Tempo impiegato per eliminare spazi e righe vuote -> 0.10300 secondi

Tempo impiegato per mescolare-> 18.13500 secondi

Tempo totale -> 18.27000 secondi

Premere INVIO per terminare.

Execution time: 20.896 s

C:\Contest19\Exe>
--------------------------------------------------------------------------------------------------------------------

C:\Contest19\Exe>ptime c19Repne01 output.txt 512

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

=== c19Repne01 output.txt 512 ===
CreateTextTestFile - Build 1
Output file size: 512 MiB

Execution time: 4.547 s

C:\Contest19\Exe>ptime c19Repne02 output.txt 512

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

=== c19Repne02 output.txt 512 ===
CreateTextTestFile - Build 2
Output file size: 512 MiB

Execution time: 17.885 s

C:\Contest19\Exe>
---------------------------------------------------------------------------------------------------------------------------

C:\Contest19\Exe>ptime java -server Generate output.txt -D500MB

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

=== java -server Generate output.txt -D500MB ===
Error: missing `server' JVM at `C:\Program Files\Java\jre7\bin\server\jvm.dll'.
Please install or use the JRE or JDK that contains these missing components.

Execution time: 0.108 s

C:\Contest19\Exe>ptime java Generate output.txt -D500MB

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

=== java Generate output.txt -D500MB ===
ci ho messo 19 secondi

Execution time: 20.918 s

C:\Contest19\Exe>
-----------------------------------------------------------------------------------------------------------------------------

Vincenzo1968
23-01-2013, 21:34
Da notare gli ottimi tempi della prima versione di AnonimoVeneziano. Ma Repne non si batte con i suoi quattro secondi(e mezzo) della versione 1.

;)

Vincenzo1968
23-01-2013, 21:39
Da qui totto ok grazie :)

Di niente ;)

Vincenzo1968
24-01-2013, 09:02
Che mi venga un colpo!

Mi accorgo soltanto adesso che nella versione di Repne ho passato 512 MB(1024 / 2). Avrei dovuto mettere 500.

Più tardi rifaccio le prove sul portatilino. :D

Vincenzo1968
24-01-2013, 09:37
Da Wikipedia:

http://it.wikipedia.org/wiki/Disco_rigido

Il tempo di accesso è la variabile più importante nel determinare le prestazioni di un disco rigido (conoscendo il modello facilmente si può risalire ai dati tecnici dell'unità compreso il tempo di accesso; molti produttori di computer non menzionano questo dato e a volte nemmeno la marca e il modello). Si tratta del tempo medio necessario perché un dato, residente in un punto casuale del disco, possa essere reperito. Il tempo impiegato dipende dalla velocità della testina a spostarsi sulla traccia dove risiede il dato e dalla velocità di rotazione del disco; maggiore è la velocità e più breve è il tempo impiegato dal dato a ripassare sotto la testina nel caso questa non fosse arrivata in tempo sul dato, durante la rotazione precedente (latenza rotazionale). I produttori cercano perciò di realizzare testine sempre più leggere (che possono spostarsi più in fretta perché dotate di minore inerzia) e dischi che girano più velocemente. Il tempo di accesso tipico per un disco rigido da 7200 rpm è di circa 9 millisecondi (ms), per uno da 15.000 rpm è inferiore a 4 ms.

La velocità di trasferimento è la quantità di dati fornita dal disco rigido in un determinato tempo (in genere si prende 1 secondo come riferimento). Usare dischi che ruotino più velocemente o incrementare la densità di memorizzazione porta ad un miglioramento diretto della velocità di trasferimento. Va ricordato che la velocità di trasferimento cala in modo proporzionale al numero di discontinuità nei settori che compongono il file ricercato (vedi frammentazione).
...

Il tempo di accesso a disco è influenzato da cinque fattori:

Controller Overhead (overhead del controllore): è il tempo necessario alla gestione dei dati e l'invio dell'opportuno interrupt; è il tempo in assoluto minore;
Seek time (tempo di ricerca): è il tempo necessario a spostare la testina sulla traccia; è il fattore più critico poiché si tratta di un movimento meccanico e non di un impulso elettrico; questo fa sì che non si possa scendere al di sotto di qualche decina di millisecondo;
Assessment time (tempo di assestamento): è il tempo necessario all'assestamento della testina sulla traccia dopo lo spostamento; spesso viene inglobato nel 'Seek time;
Latency time (tempo di latenza): (anche rotational latency) è il tempo necessario perché, a causa della rotazione del disco, l'inizio del settore desiderato arrivi a trovarsi sotto la testina; ovviamente dipende dalla velocità dello spindle; per esempio con una velocità (tipica) di 5400 rpm, il tempo di latenza massimo è di circa 11 millisecondi;
Rotational time (tempo di rotazione): è il tempo necessario al settore per passare sotto la testina, tempo durante il quale il settore viene letto o scritto.

Tempo di accesso: ControllerOverhead + SeekTime + Latency + RotationalTime


C'è modo di ottenere tutti questi bei dati sulla propria macchina via software(anche attraverso routine assembly)?

dierre
24-01-2013, 09:49
Generate.java (http://cl.ly/MNEp)

Le righe vuote non venivano cancellate perché hai fatto i file di testo su windows ed ovviamente li newline è cr+lf sui sistemi di mamma ms.

Posso chiederti perché hai dichiarato tutti i metodi di FileParser static (tranne quello da overridare ovviamente per Callable) ?

Vincenzo1968
24-01-2013, 10:05
Sto dando un'occhiata a questi:

http://www.codeproject.com/Articles/17973/How-To-Get-Hardware-Information-CPU-ID-MainBoard-I

http://www.faqforge.com/linux/how-to-get-detailed-information-about-the-harddisk-installed-on-a-linux-server/

http://www.computerhope.com/issues/ch000497.htm

http://superuser.com/questions/59844/any-software-tool-to-identify-make-of-internal-hard-disk

http://superuser.com/questions/386907/how-to-check-harddisk-type

http://www.sqlservercentral.com/Forums/Topic1062488-1351-1.aspx

http://www.cyberciti.biz/faq/find-hard-disk-hardware-specs-on-linux/

http://servercomputing.blogspot.it/2012/05/linux-find-out-hard-disk-information.html

http://unix.stackexchange.com/questions/4561/how-do-i-find-out-what-hard-disks-are-in-the-system

http://en.kioskea.net/faq/13488-linux-getting-information-about-your-hard-disks

Vincenzo1968
24-01-2013, 10:07
Posso chiederti perché hai dichiarato tutti i metodi di FileParser static (tranne quello da overridare ovviamente per Callable) ?

Puoi anzi devi. I contest per questo li facciamo. ;)

Vincenzo1968
24-01-2013, 10:13
vincenzo@Ubuntu12-10-AMD64:~$ sudo hdparm -I /dev/sda

/dev/sda:

ATA device, with non-removable media
Model Number: ST1000DM003-9YN162
Serial Number: S1D4S6D4
Firmware Revision: CC4B
Transport: Serial, SATA Rev 3.0
Standards:
Used: unknown (minor revision code 0x0029)
Supported: 8 7 6 5
Likely used: 8
Configuration:
Logical max current
cylinders 16383 16383
heads 16 16
sectors/track 63 63
--
CHS current addressable sectors: 16514064
LBA user addressable sectors: 268435455
LBA48 user addressable sectors: 1953525168
Logical Sector size: 512 bytes
Physical Sector size: 4096 bytes
Logical Sector-0 offset: 0 bytes
device size with M = 1024*1024: 953869 MBytes
device size with M = 1000*1000: 1000204 MBytes (1000 GB)
cache/buffer size = unknown
Nominal Media Rotation Rate: 7200
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 32
Standby timer values: spec'd by Standard, no device specific minimum
R/W multiple sector transfer: Max = 16 Current = 1
Advanced power management level: 254
Recommended acoustic management value: 208, current value: 0
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
Cycle time: no flow control=120ns IORDY flow control=120ns
Commands/features:
Enabled Supported:
SMART feature set
Security Mode feature set
* Power Management feature set
* Write cache
* Look-ahead
* Host Protected Area feature set
* WRITE_BUFFER command
* READ_BUFFER command
* DOWNLOAD_MICROCODE
* Advanced Power Management feature set
SET_MAX security extension
* 48-bit Address feature set
* Device Configuration Overlay feature set
* Mandatory FLUSH_CACHE
* FLUSH_CACHE_EXT
* SMART error logging
* SMART self-test
* General Purpose Logging feature set
* WRITE_{DMA|MULTIPLE}_FUA_EXT
* 64-bit World wide name
Write-Read-Verify feature set
* WRITE_UNCORRECTABLE_EXT command
* {READ,WRITE}_DMA_EXT_GPL commands
* Segmented DOWNLOAD_MICROCODE
* Gen1 signaling speed (1.5Gb/s)
* Gen2 signaling speed (3.0Gb/s)
* Gen3 signaling speed (6.0Gb/s)
* Native Command Queueing (NCQ)
* Phy event counters
* unknown 76[15]
* DMA Setup Auto-Activate optimization
Device-initiated interface power management
* Software settings preservation
* SMART Command Transport (SCT) feature set
* SCT LBA Segment Access (AC2)
unknown 206[7]
unknown 206[12] (vendor specific)
unknown 206[13] (vendor specific)
Security:
Master password revision code = 65534
supported
not enabled
not locked
frozen
not expired: security count
supported: enhanced erase
108min for SECURITY ERASE UNIT. 108min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 5000c500521c5ceb
NAA : 5
IEEE OUI : 000c50
Unique ID : 0521c5ceb
Checksum: correct
vincenzo@Ubuntu12-10-AMD64:~$



http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Un comando simile su Windows? Magari tramite WMI o PowerShell?

Vincenzo1968
24-01-2013, 10:26
vincenzo@Ubuntu12-10-AMD64:~$ sudo lshw -class disk
*-disk
description: ATA Disk
product: ST1000DM003-9YN1
vendor: Seagate
physical id: 0.0.0
bus info: scsi@0:0.0.0
logical name: /dev/sda
version: CC4B
serial: S1D4S6D4
size: 931GiB (1TB)
capabilities: partitioned partitioned:dos
configuration: ansiversion=5 sectorsize=4096 signature=00097294
*-cdrom
description: DVD-RAM writer
product: CDDVDW SH-S203D
vendor: TSSTcorp
physical id: 0.0.0
bus info: scsi@1:0.0.0
logical name: /dev/cdrom
logical name: /dev/cdrw
logical name: /dev/dvd
logical name: /dev/dvdrw
logical name: /dev/sr0
version: SB00
capabilities: removable audio cd-r cd-rw dvd dvd-r dvd-ram
configuration: ansiversion=5 status=nodisc
*-disk
description: ATA Disk
product: MAXTOR STM316081
vendor: Maxtor
physical id: 0.0.0
bus info: scsi@2:0.0.0
logical name: /dev/sdb
version: 4.AA
serial: 9RA50LXT
size: 149GiB (160GB)
capabilities: partitioned partitioned:dos
configuration: ansiversion=5 sectorsize=512 signature=3850384f
vincenzo@Ubuntu12-10-AMD64:~$


http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Il disco dove ho installato Linux è questo:


*-disk
description: ATA Disk
product: ST1000DM003-9YN1
vendor: Seagate
physical id: 0.0.0
bus info: scsi@0:0.0.0
logical name: /dev/sda
version: CC4B
serial: S1D4S6D4
size: 931GiB (1TB)
capabilities: partitioned partitioned:dos
configuration: ansiversion=5 sectorsize=4096 signature=00097294


Nell'altro(quello da 160GiB) c'ho Windoxs XP.

VICIUS
24-01-2013, 10:27
Posso chiederti perché hai dichiarato tutti i metodi di FileParser static (tranne quello da overridare ovviamente per Callable) ?

Per rendere esplicito che quella funzione non andrà a modificare lo stato dell'oggetto. In questo modo il compilatore può fare il controllo a compile time e sputarmi in un occhio se provo a fare qualche trucchetto strano. In questo caso non credo serva a tanto ma ormai ho preso la buona abitudine di farlo quindi mi viene in automatico.

Ci sarebbe anche da dire che gira la leggenda che i metodi static siano leggermente più veloci. Magari se è vero ci guadagno in prestazioni. :asd:

Vincenzo1968
24-01-2013, 10:39
vincenzo@Ubuntu12-10-AMD64:~$ sudo fdisk -l

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 testine, 63 settori/tracce, 121601 cilindri, totale 1953525168 settori
Unità = settori di 1 * 512 = 512 byte
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Identificativo disco: 0x00097294

Dispositivo Boot Start End Blocks Id System
/dev/sda1 * 2048 499711 248832 83 Linux
/dev/sda2 501758 1953523711 976510977 5 Esteso
Partition 2 does not start on physical sector boundary.
/dev/sda5 501760 1953523711 976510976 8e Linux LVM

Disk /dev/sdb: 160.0 GB, 160041885696 bytes
255 testine, 63 settori/tracce, 19457 cilindri, totale 312581808 settori
Unità = settori di 1 * 512 = 512 byte
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificativo disco: 0x3850384f

Dispositivo Boot Start End Blocks Id System
/dev/sdb1 * 63 312560639 156280288+ 7 HPFS/NTFS/exFAT

Disk /dev/mapper/ubuntu-root: 995.7 GB, 995740352512 bytes
255 testine, 63 settori/tracce, 121058 cilindri, totale 1944805376 settori
Unità = settori di 1 * 512 = 512 byte
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Identificativo disco: 0x00000000

Il disco /dev/mapper/ubuntu-root non contiene una tabella delle partizioni valida

Disco /dev/mapper/ubuntu-swap_1: 4156 MB, 4156555264 byte
255 testine, 63 settori/tracce, 505 cilindri, totale 8118272 settori
Unità = settori di 1 * 512 = 512 byte
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Identificativo disco: 0x00000000

Il disco /dev/mapper/ubuntu-swap_1 non contiene una tabella delle partizioni valida
vincenzo@Ubuntu12-10-AMD64:~$


http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
24-01-2013, 11:52
Io mi cucino. Possibile che su Windows non ci sia un comando shell semplice semplice per ottenere informazioni dettagliate sul disco fisso?

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

cdimauro
24-01-2013, 12:01
Ci sarebbe anche da dire che gira la leggenda che i metodi static siano leggermente più veloci. Magari se è vero ci guadagno in prestazioni. :asd:
I metodi static dovrebbero essere convertiti in una call che specifica direttamente l'indirizzo della routine da chiamare.

Per quelli virtuali ci sono due possibilità. La prima, è che il compilatore mantenga in un registro l'indirizzo della VMT, e quindi usandolo come "base" vada poi a recuperare dalla memoria l'indirizzo della routine a cui saltare. Il secondo è che ogni volta venga prelevato dall'istanza il puntatore alla VMT, e poi si proceda come col primo punto.
In entrambi i casi, le prestazioni sono leggermente inferiori rispetto a una chiamata a un metodo statico.
Io mi cucino. Possibile che su Windows non ci sia un comando shell semplice semplice per ottenere informazioni dettagliate sul disco fisso?
Se nessuno lo scrive... no. :D

Vincenzo1968
24-01-2013, 12:35
Finora ho provato questi comandi PowerShell che forniscono tutta una serie di inutili informazioni:


Get-WmiObject win32_bios

Get-WmiObject -List

Get-WmiObject Win32_OperatingSystem

Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-List TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles


Power :rolleyes: Shell :rolleyes:

:D

Vincenzo1968
24-01-2013, 12:38
Ma almeno per vedere produttore e modello su Windows 8? Com'è? Sistema -> Avanzate -> ?

E comunque mi accontenterei anche di un comando non tanto semplice, anche complicato complicato.

Vincenzo1968
24-01-2013, 12:44
Forse ho trovato qualcosina:

http://disablehddapm.blogspot.it/

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
24-01-2013, 12:55
msinfo32


http://img594.imageshack.us/img594/1606/discowindowsxp.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Questo è XP. Vado a vedere su Win8.

Vincenzo1968
24-01-2013, 13:22
E questo è il mio disco fisso su Windows 8 64 bit:

http://img39.imageshack.us/img39/1718/discowindows8.jpg

dierre
24-01-2013, 13:26
Per rendere esplicito che quella funzione non andrà a modificare lo stato dell'oggetto. In questo modo il compilatore può fare il controllo a compile time e sputarmi in un occhio se provo a fare qualche trucchetto strano. In questo caso non credo serva a tanto ma ormai ho preso la buona abitudine di farlo quindi mi viene in automatico.

Ci sarebbe anche da dire che gira la leggenda che i metodi static siano leggermente più veloci. Magari se è vero ci guadagno in prestazioni. :asd:

Ok, tnx :asd:

Vincenzo1968
24-01-2013, 13:32
Riepilogo per Repne:

quello sopra è il mio disco su Windows 8.

Questo è il mio disco su Linux:

*-disk
description: ATA Disk
product: ST1000DM003-9YN1
vendor: Seagate
physical id: 0.0.0
bus info: scsi@0:0.0.0
logical name: /dev/sda
version: CC4B
serial: S1D4S6D4
size: 931GiB (1TB)
capabilities: partitioned partitioned:dos
configuration: ansiversion=5 sectorsize=4096 signature=00097294


ATA device, with non-removable media
Model Number: ST1000DM003-9YN162
Serial Number: S1D4S6D4
Firmware Revision: CC4B
Transport: Serial, SATA Rev 3.0
Standards:
Used: unknown (minor revision code 0x0029)
Supported: 8 7 6 5
Likely used: 8
Configuration:
Logical max current
cylinders 16383 16383
heads 16 16
sectors/track 63 63
--
CHS current addressable sectors: 16514064
LBA user addressable sectors: 268435455
LBA48 user addressable sectors: 1953525168
Logical Sector size: 512 bytes
Physical Sector size: 4096 bytes
Logical Sector-0 offset: 0 bytes
device size with M = 1024*1024: 953869 MBytes
device size with M = 1000*1000: 1000204 MBytes (1000 GB)
cache/buffer size = unknown
Nominal Media Rotation Rate: 7200
Capabilities:
LBA, IORDY(can be disabled)
Queue depth: 32
Standby timer values: spec'd by Standard, no device specific minimum
R/W multiple sector transfer: Max = 16 Current = 1
Advanced power management level: 254
Recommended acoustic management value: 208, current value: 0
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
Cycle time: no flow control=120ns IORDY flow control=120ns
Commands/features:
Enabled Supported:
SMART feature set
Security Mode feature set
* Power Management feature set
* Write cache
* Look-ahead
* Host Protected Area feature set
* WRITE_BUFFER command
* READ_BUFFER command
* DOWNLOAD_MICROCODE
* Advanced Power Management feature set
SET_MAX security extension
* 48-bit Address feature set
* Device Configuration Overlay feature set
* Mandatory FLUSH_CACHE
* FLUSH_CACHE_EXT
* SMART error logging
* SMART self-test
* General Purpose Logging feature set
* WRITE_{DMA|MULTIPLE}_FUA_EXT
* 64-bit World wide name
Write-Read-Verify feature set
* WRITE_UNCORRECTABLE_EXT command
* {READ,WRITE}_DMA_EXT_GPL commands
* Segmented DOWNLOAD_MICROCODE
* Gen1 signaling speed (1.5Gb/s)
* Gen2 signaling speed (3.0Gb/s)
* Gen3 signaling speed (6.0Gb/s)
* Native Command Queueing (NCQ)
* Phy event counters
* unknown 76[15]
* DMA Setup Auto-Activate optimization
Device-initiated interface power management
* Software settings preservation
* SMART Command Transport (SCT) feature set
* SCT LBA Segment Access (AC2)
unknown 206[7]
unknown 206[12] (vendor specific)
unknown 206[13] (vendor specific)
Security:
Master password revision code = 65534
supported
not enabled
not locked
frozen
not expired: security count
supported: enhanced erase
108min for SECURITY ERASE UNIT. 108min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 5000c500521c5ceb
NAA : 5
IEEE OUI : 000c50
Unique ID : 0521c5ceb
Checksum: correct

rеpne scasb
24-01-2013, 18:10
Riepilogo per Repne:

quello sopra è il mio disco su Windows 8.

Questo è il mio disco su Linux:

I due dischi hanno prestazioni simili e quindi come causa della differanza di prestazioni tra Windows 8 e Linux e' necessario considerare:

1) Efficienza compilatore
2) Efficienza OS nella gestione del file-system

Il punto 1) e' poco rilevante per i software sviluppati nella prima parte di questo contest (I/O intenso) e quindi non rimane altro da considerare che il punto 2) come causa della differenza di prestazioni.

Vincenzo1968
24-01-2013, 18:13
I due dischi hanno prestazioni simili e quindi come causa della differanza di prestazioni tra Windows 8 e Linux e' necessario considerare:

1) Efficienza compilatore
2) Efficienza OS nella gestione del file-system

Il punto 1) e' poco rilevante per i software sviluppati nella prima parte di questo contest (I/O intenso) e quindi non rimane altro da considerare che il punto 2) come causa della differenza di prestazioni.

Dunque merito di Linux. Linux mon amour :D

EDIT: sarà anche per questo motivo che Linux è il più utilizzato in ambito server?

Vincenzo1968
24-01-2013, 19:50
Brute force:

http://img819.imageshack.us/img819/4994/c19b01bruteforce.jpg

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
24-01-2013, 21:11
Brute force sul portatilino con Windows 8 32 bit(file di 2 GiB):

http://img580.imageshack.us/img580/3420/c19bruteforcewin832.jpg

marco.r
24-01-2013, 21:32
http://img837.imageshack.us/img837/904/verificamarcor.jpg

C'è qualcosina che non va. Non elimina gli spazi superflui e le righe vuote.

Comunque direi di passare ai punti B e C senza indugiare oltre.

My bad, c'è un errore nello script che ho riportato. Prova a cambiare

's/\s+/ /g'

con

's/\s\+/ /g'

Vincenzo1968
24-01-2013, 21:35
Ok, provvedo subito ;)

ah, Marco, una cosa: puoi evitare di fargli stampare a video tutti i messaggi? Secondo me è per questo che il tuo impiega troppo tempo.

EDIT: Ma che provvedo subito? ma dove ce l'ho la testa? Sono sul portatilino con Windows. Domani posso provare le tue modifiche. ;)

banryu79
25-01-2013, 08:54
Dunque merito di Linux. Linux mon amour :D

EDIT: sarà anche per questo motivo che Linux è il più utilizzato in ambito server?
Se non sbaglio, su Linux non c'è neccessità di utility per la deframmentazione del disco: fa già tutto il File System in maniera trasparente all'utente.
Se è così, questa è già una bella differenza, rispetto ai sistemi Windows.

https://en.wikipedia.org/wiki/Unix_File_System

Vincenzo1968
25-01-2013, 10:47
Se non sbaglio, su Linux non c'è neccessità di utility per la deframmentazione del disco: fa già tutto il File System in maniera trasparente all'utente.
Se è così, questa è già una bella differenza, rispetto ai sistemi Windows.

https://en.wikipedia.org/wiki/Unix_File_System

Sempre più contento di avere scoperto Linux. Dopo vent'anni. Meglio tardi che mai. :D

Grazie per il link. ;)

The_ouroboros
25-01-2013, 11:00
frammentazione minore ma sempre presente. E' fisiologica degli fs :stordita:

Vincenzo1968
25-01-2013, 11:01
L'output di Marco:


16795042 byte (17 MB) copiati, 0,17202 s, 97,6 MB/s
16+1 record dentro
16+1 record fuori
16795042 byte (17 MB) copiati, 0,171078 s, 98,2 MB/s
16+1 record dentro
16+1 record fuori
16795042 byte (17 MB) copiati, 0,174065 s, 96,5 MB/s
16+1 record dentro
16+1 record fuori
16795042 byte (17 MB) copiati, 0,173778 s, 96,6 MB/s
16+1 record dentro
16+1 record fuori
16795042 byte (17 MB) copiati, 0,170858 s, 98,3 MB/s
16+1 record dentro
16+1 record fuori
16795042 byte (17 MB) copiati, 0,199496 s, 84,2 MB/s

real 1m3.545s
user 0m24.858s
sys 0m45.375s
vincenzo@Ubuntu12-10-AMD64:~/Contest19/Exe$

Togliendo l'output a video, come dicevo prima, il programma dovrebbe essere più veloce.

C'è ancora qualcosina che non va. Lascia gli spazi:
http://img90.imageshack.us/img90/7936/outmarco.jpg

EDIT: posto il programma di Marco con le modifiche che m'ha indicato. Non vorrei avere sbagliato io:

#!/bin/sh
SIZE=$(echo $2 | sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/;s/$/ +\\/; $a0' | bc)
BS=1000000
COUNT=$(echo 1 + $SIZE / $BS | bc )
OUTPUT=$1
echo > $OUTPUT

cat All/*.txt | sed -e 's/\s\+/ /g' | grep -v '^\s*$' > text.dat
while $(test `stat --format '%s' $OUTPUT` -lt $SIZE )
do
shuf text.dat | dd bs=$BS iflag=fullblock count=$COUNT >> $OUTPUT
done
truncate -s $SIZE $OUTPUT

Vincenzo1968
25-01-2013, 11:31
Finalmente sono riuscito a entrare. Per cinque minuti buoni ogni volta che cliccavo su un link si apriva la pagina con la pubblicità Microsoft.

http://www.hwupgrade.org/public/style_emoticons/default/rage.png

C'è da dire che la versione 1 di Repne riesce a eliminare quasi del tutto le inefficienze di Windows.
Il suo programma risulta lievemente più lento su Windows(circa 5 secondi).
I nostri invece(ma anche le versioni 2 e 3 di Repne) risultano tre volte più lenti: circa 90 secondi contro i circa 30 su Linux.

Come fa? :D

Repne, se per il momento vuoi mantenere il segreto, ok. Ma alla fine dovrai spiegarcelo. ;)

Vincenzo1968
25-01-2013, 11:33
Vale la pena riportare la versione 1 di Repne:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//#include <mem.h>
#include <malloc.h>

#define N_INPUT_FILE 33
#define N_SWAP_PER_ELEMENT 8
#define N_SWAP_RAND_FILE (N_INPUT_FILE*N_SWAP_PER_ELEMENT)
#define MAX_LINE_PER_FILE 65536
#define BUFFER_MB_BLOCK 16
#define BUFFER_OUTPUT_SIZE (BUFFER_MB_BLOCK*1024*1024)

int main(argc,argv)
int argc;
char *argv[];

{
unsigned char **n,*m,*tmp_buffer_output,*buffer_output,*tmp1_buffer,*tmp2_buffer,*tmp3_buffer,*tmp4_buffer,**line_pointer[N_INPUT_FILE],*buffer_input_file[N_INPUT_FILE],*input_file_name[N_INPUT_FILE]=
{"All/amor_fa_.txt", "All/bertoldo.txt","All/candid_t.txt","All/convivio.txt","All/dell_art.txt","All/del_roma.txt","All/del_tr_t.txt","All/descartes_discorso_sul_metodo.txt","All/de_vulga.txt","All/dialogo_.txt","All/diario_d.txt","All/discorsi.txt","All/don_chis.txt","All/il_bugia.txt","All/il_corsa.txt","All/il_saggi.txt","All/i_pirati.txt","All/i_promes.txt","All/la_banca.txt","All/la_divin.txt","All/la_ric_t.txt","All/la_rivin.txt","All/la_tigre.txt","All/le_mecan.txt","All/le_opere.txt","All/le_tigri.txt","All/l_adulat.txt","All/l_amante.txt","All/l_avaro.txt","All/principe.txt","All/sidereus.txt","All/storia_d.txt","All/sulla_or.txt"};
//{"amor_fa_.txt","bertoldo.txt","candid_t.txt","convivio.txt","dell_art.txt","del_roma.txt","del_tr_t.txt","descartes_discorso_sul_metodo.txt","de_vulga.txt","dialogo_.txt","diario_d.txt","discorsi.txt","don_chis.txt","il_bugia.txt","il_corsa.txt","il_saggi.txt","i_pirati.txt","i_promes.txt","la_banca.txt","la_divin.txt","la_ric_t.txt","la_rivin.txt","la_tigre.txt","le_mecan.txt","le_opere.txt","le_tigri.txt","l_adulat.txt","l_amante.txt","l_avaro.txt","principe.txt","sidereus.txt","storia_d.txt","sulla_or.txt"};
int *o,i,j,k,l,p,n_line_size,last_char,line_file,output_file_size=1,input_file_size[N_INPUT_FILE],*line_size[N_INPUT_FILE],tmp_line_per_file[N_INPUT_FILE],line_per_file[N_INPUT_FILE];
FILE *input_file,*output_file;
time_t t;

printf("CreateTextTestFile - Build 1\n");

if((argc<2)||(argc>3))
{
printf("Use: %s <output_file_name> [optional_size_in_MBytes]",argv[0]);
return 1;
}

if(argc==3)
output_file_size=atoi(argv[2])/BUFFER_MB_BLOCK;

printf("Output file size: %d MiB\n",output_file_size*BUFFER_MB_BLOCK);

if(output_file_size<1)
{
printf("Invalid [optional_size_in_MBytes]\n");
return 1;
}

srand((unsigned)time(&t));

for(i=0;i<N_INPUT_FILE;i++)
{
if((input_file=fopen(input_file_name[i],"rb"))==NULL)
{
printf("Unable to open input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_END))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((input_file_size[i]=ftell(input_file))==-1)
{
printf("Unable to tell input file: %s\n",input_file_name[i]);
return 1;
}

if(fseek(input_file,0L,SEEK_SET))
{
printf("Unable to seek input file: %s\n",input_file_name[i]);
return 1;
}

if((buffer_input_file[i]=malloc(input_file_size[i]))==NULL)
{
printf("Unable to allocate %d bytes %s\n",input_file_size[i]);
return 1;
}

if((line_size[i]=malloc(MAX_LINE_PER_FILE*sizeof(int)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(int));
return 1;
}

if((line_pointer[i]=malloc(MAX_LINE_PER_FILE*sizeof(char *)))==NULL)
{
printf("Unable to allocate %d bytes %s\n",MAX_LINE_PER_FILE*sizeof(char *));
return 1;
}

if(fread(buffer_input_file[i],input_file_size[i],1,input_file)==0)
{
printf("Unable to read input file: %s\n",input_file_name[i]);
return 1;
}

if(fclose(input_file)!=NULL)
{
printf("Unable to close input file: %s\n",input_file_name[i]);
return 1;
}
}

for(i = 0; i < N_INPUT_FILE; i++)
{
line_file = 0;
tmp2_buffer = tmp1_buffer = buffer_input_file[i];
tmp3_buffer = tmp1_buffer + input_file_size[i];

do
{
last_char = n_line_size = 0;
tmp4_buffer = tmp2_buffer;
while ((*tmp1_buffer != 0x0A) && (*tmp1_buffer != 0x0D) && (tmp1_buffer<tmp3_buffer))
{
if( (*tmp1_buffer == 0x20) || (*tmp1_buffer == 0x09) )
{
if( last_char == 1 )
{
last_char = 0;
*tmp2_buffer = 0x20;
tmp2_buffer++;
n_line_size++;
}
}
else
{
last_char = 1;
*tmp2_buffer = *tmp1_buffer;
tmp2_buffer++;
n_line_size++;
}
tmp1_buffer++;
}

tmp1_buffer++;
if(tmp1_buffer < tmp3_buffer)
{
if((*tmp1_buffer == 0x0A) || (*tmp1_buffer == 0x0D))
tmp1_buffer++;
}

if(n_line_size)
{
*(unsigned short *)tmp2_buffer = 0x0A0D;
tmp2_buffer += 2;
line_size[i][line_file] = n_line_size+2;
line_pointer[i][line_file] = tmp4_buffer;
line_file++;
}

} while (tmp1_buffer < tmp3_buffer);

line_per_file[i] = line_file;
}

if((output_file = fopen(argv[1], "wb")) == NULL)
{
printf("Unable to create output file: %s\n", argv[1]);
return 1;
}

if((buffer_output = malloc(BUFFER_OUTPUT_SIZE)) == NULL)
{
printf("Unable to allocate %d bytes %s\n", BUFFER_OUTPUT_SIZE);
return 1;
}

for(i = 0; i <N_SWAP_RAND_FILE; i++)
{
j = rand()%N_INPUT_FILE;
k = rand()%N_INPUT_FILE;
l = line_per_file[j];
line_per_file[j] = line_per_file[k];
line_per_file[k] = l;
n = line_pointer[j];
line_pointer[j] = line_pointer[k];
line_pointer[k] = n;
o = line_size[j];
line_size[j] = line_size[k];
line_size[k] = o;
}

for(i = 0; i < N_INPUT_FILE; i++)
{

for(j = 0; j < (line_per_file[i]*N_SWAP_PER_ELEMENT); j++)
{
k = rand()%line_per_file[i];
l = rand()%line_per_file[i];
m = line_pointer[i][k];
line_pointer[i][k] = line_pointer[i][l];
line_pointer[i][l] = m;
p = line_size[i][k];
line_size[i][k] = line_size[i][l];
line_size[i][l] = p;
}

tmp_line_per_file[i] = 0;
}

tmp_buffer_output = buffer_output;
while (1)
{
for(i = 0; i < N_INPUT_FILE; i++)
{
k = line_size[i][tmp_line_per_file[i]];
if(tmp_buffer_output + k < (buffer_output + BUFFER_OUTPUT_SIZE))
{
memcpy(tmp_buffer_output, line_pointer[i][tmp_line_per_file[i]], k);

if(*tmp_buffer_output == 0x00)
{
return 1;
}

tmp_buffer_output += k;
}
else
{
j = buffer_output + BUFFER_OUTPUT_SIZE - tmp_buffer_output;
memcpy(tmp_buffer_output, line_pointer[i][tmp_line_per_file[i]], j);

if(fwrite(buffer_output,BUFFER_OUTPUT_SIZE,1,output_file) == 0)
{
printf("Unable to write output file: %s\n", argv[1]);
return 1;
}

output_file_size--;
if(output_file_size == 0)
break;

tmp_buffer_output = buffer_output;
memcpy(tmp_buffer_output, line_pointer[i][tmp_line_per_file[i]], k - j);
tmp_buffer_output += k - j;
}

tmp_line_per_file[i]++;
if(tmp_line_per_file[i] == line_per_file[i])
tmp_line_per_file[i] = 0;
}

if(output_file_size == 0)
break;
}

if(fclose(output_file) != NULL)
{
printf("Unable to close output file: %s\n",argv[1]);
return 1;
}

for(i = 0; i < N_INPUT_FILE; i++)
{
free(buffer_input_file[i]);
free(line_size[i]);
free(line_pointer[i]);
}
free(buffer_output);

return 0;
}

Vincenzo1968
25-01-2013, 12:28
La versione di Gugo ci mette 7 ore:

http://img213.imageshack.us/img213/2249/c19agugo.jpg

Vincenzo1968
25-01-2013, 15:40
time ./puntoB01 output.txt notaio


http://img9.imageshack.us/img9/2570/c19tempimieib01.jpg

file da 1 GiB; algoritmo brute force.

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
25-01-2013, 15:46
Il programma di default di Gugo:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Contest19AGugo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("\nTempo impiegato -> 7 ore.\n");
}
}
}


Come da accordi presi in passato, se non partecipa a un contest, gli viene assegnato il programma di cui sopra per default.

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Vincenzo1968
25-01-2013, 16:49
http://img692.imageshack.us/img692/2967/c19myoutputb01.jpg

Lo provo su Windows e posto il codice.

Vincenzo1968
25-01-2013, 17:31
Ecco il mio sorgente per il punto B.1:

https://skydrive.live.com/#cid=67AC1A498A9C2339&id=67AC1A498A9C2339%21110





Ricerca brute force su Windows 8 64 bit; dimensione file 5 GiB:

http://img845.imageshack.us/img845/779/c19b01myoutputwin8.jpg

rеpne scasb
25-01-2013, 18:45
Il punto B.1 recita:

"B.1:
Si realizzi un programmino che, data in input una stringa di ricerca, indichi l'esatta posizione (riga e colonna) nel file creato al punto A.

Si prendano separatamente i tempi per la creazione dell'indice e quelli per la ricerca.

Se volete utilizzare un algoritmo brute force, senza creare l'indice, siete liberi di farlo."

Non è chiaro cosa sia una "stringa di ricerca". Sono:

a) Una o più parole delimitate da spazi?
b) Contiene o meno numeri?
c) Contiene o meno caratteri alfanumerici?
d) Distingue tra minuscole e maiuscole?
e) Con ricerca parziale?

Per semplificare il punto io proporrei la ricerca di una singola parola senza distinzione tra maiuscole o minuscole con caratteri esclusivamente alfabetici e senza occorrenze parziali (se gli dico di cercare tempo non mi deve trovare temporale).

rеpne scasb
25-01-2013, 18:50
Repne, se per il momento vuoi mantenere il segreto, ok. Ma alla fine dovrai spiegarcelo. ;)

Nessun segreto utilizzo un buffer di 16Mb in uscita. La fwrite scrive 16Mb alla volta e non una riga alla volta. Tutto qua.

gugoXX
25-01-2013, 18:54
Il programma di default di Gugo:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Contest19AGugo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("\nTempo impiegato -> 7 ore.\n");
}
}
}


Come da accordi presi in passato, se non partecipa a un contest, gli viene assegnato il programma di cui sopra per default.

http://www.hwupgrade.org/public/style_emoticons/default/coolface.png

Ma pensa te... :rolleyes:

Vincenzo1968
25-01-2013, 18:57
Nessun segreto utilizzo un buffer di 16Mb in uscita. La fwrite scrive 16Mb alla volta e non una riga alla volta. Tutto qua.

Non avevo rivolto la domanda in modo polemico. Se ti ho dato quest'impressione scusami.

http://www.hwupgrade.org/public/style_emoticons/default/okay.png

È che davvero sono interessato a come riesci a ottenere queste performance. ;)

Comunque, ragazzuoli, alla fine tutti dovremo spiegare ciò che fa il nostro codice in modo da far capire anche a chi non programma nel nostro linguaggio(o si sta avvicinando adesso al mondo della programmazione).

;)

Vincenzo1968
25-01-2013, 18:59
Ma pensa te... :rolleyes:

Gli accordi sono gli accordi. :O

http://www.hwupgrade.org/public/style_emoticons/default/patpat.gif

Vincenzo1968
25-01-2013, 19:01
Il punto B.1 recita:

"B.1:
Si realizzi un programmino che, data in input una stringa di ricerca, indichi l'esatta posizione (riga e colonna) nel file creato al punto A.

Si prendano separatamente i tempi per la creazione dell'indice e quelli per la ricerca.

Se volete utilizzare un algoritmo brute force, senza creare l'indice, siete liberi di farlo."

Non è chiaro cosa sia una "stringa di ricerca". Sono:

a) Una o più parole delimitate da spazi?
b) Contiene o meno numeri?
c) Contiene o meno caratteri alfanumerici?
d) Distingue tra minuscole e maiuscole?
e) Con ricerca parziale?

Per semplificare il punto io proporrei la ricerca di una singola parola senza distinzione tra maiuscole o minuscole con caratteri esclusivamente alfabetici e senza occorrenze parziali (se gli dico di cercare tempo non mi deve trovare temporale).

a, b e c: vero.
d: solo se non passi il parametro da riga di comando "--case-insensitive"
e: per il momento no.


Per semplificare il punto io proporrei la ricerca di una singola parola senza distinzione tra maiuscole o minuscole con caratteri esclusivamente alfabetici e senza occorrenze parziali (se gli dico di cercare tempo non mi deve trovare temporale).

Esatto. Facciamo così. Però non di una singola parola. Deve trovare la corrispondenza esatta anche se la stringa di ricerca è costituita da una o più parole separate da spazi.

;)

EDIT: Nel codice che ho postato io se c'è uno spazio fra le parole non funziona. Debbo sistemarlo. ;)

Vincenzo1968
25-01-2013, 19:03
Linux 64 bit; dimensione file 5 GiB; algoritmo: brute force.


time ./c19b01Vincenzo1968 output.txt Notaio

Inizio la ricerca case-sensitive della stringa: Notaio
Trovato alla riga 21 colonna 128
Trovato alla riga 45 colonna 125
Trovato alla riga 76 colonna 184
Trovato alla riga 106 colonna 411
Trovato alla riga 147 colonna 567
Trovato alla riga 188 colonna 680
Trovato alla riga 227 colonna 39
Trovato alla riga 2600 colonna 1344
[cut]
Trovato alla riga 2629 colonna 692
Trovato alla riga 2647 colonna 363
Trovato alla riga 2673 colonna 338
Trovato alla riga 2719 colonna 127
Trovato alla riga 2755 colonna 435
Trovato alla riga 2790 colonna 919
Trovato alla riga 2826 colonna 851
Trovato alla riga 2863 colonna 158
Trovato alla riga 2898 colonna 3
Trovato alla riga 2937 colonna 489
Trovato alla riga 2969 colonna 699
Trovato alla riga 2997 colonna 1109
Trovato alla riga 3025 colonna 389
Trovato alla riga 3063 colonna 147
Trovato alla riga 3104 colonna 957
Trovato alla riga 3131 colonna 260
Trovato alla riga 3160 colonna 17
Trovato alla riga 3197 colonna 276
Trovato alla riga 3240 colonna 535

Ho letto 1310720 blocchi.

Finito!

real 0m27.726s
user 0m18.473s
sys 0m5.844s





time ./c19b01Vincenzo1968 output.txt Notaio --case-insensitive

Inizio la ricerca case-insensitive della stringa: Notaio
Trovato alla riga 1 colonna 87
Trovato alla riga 1 colonna 196
Trovato alla riga 1 colonna 249
Trovato alla riga 1 colonna 262
[cut]... Troppo lungo ;)
Trovato alla riga 3246 colonna 1061
Trovato alla riga 3249 colonna 87
Trovato alla riga 3249 colonna 93
Trovato alla riga 3249 colonna 147
Trovato alla riga 3249 colonna 165
Trovato alla riga 3249 colonna 165
Trovato alla riga 3249 colonna 165
Trovato alla riga 3249 colonna 256

Ho letto 1310720 blocchi.

Finito!

real 0m29.472s
user 0m21.997s
sys 0m5.460s

Vincenzo1968
25-01-2013, 19:19
Nessun segreto utilizzo un buffer di 16Mb in uscita. La fwrite scrive 16Mb alla volta e non una riga alla volta. Tutto qua.

Io leggo e scrivo blocchi di 4 KB. Pensavo(e avevo letto nei libri sui DBMS) che fosse la soluzione più efficace dal punto di vista delle prestazioni.

E invece no... :D