Saya memiliki PC dengan Intel (R) Pentium (R) CPU G640 @ 2.80 GHz dan 8 GB RAM. Saya menjalankan Scientific Linux 6.5 di atasnya dengan sistem file EXT3.
Pada pengaturan ini, apa cara tercepat yang dapat saya lakukan sort -u
pada file 200 gigabyte?
Haruskah saya membagi file menjadi file yang lebih kecil (lebih kecil dari 8 GB), sort -u
menggabungkannya, lalu membaginya lagi dalam ukuran yang berbeda, sort -u
lagi, dll? Atau ada skrip penyortiran, program yang dapat menangani file sebesar ini dengan jumlah RAM yang terbatas?
/tmp
.parallel
untuk ini, saya pikir daripada moreutilsparallel
yang diinstal secara default pada beberapa sistem.sort(1)
bisa kehabisan ruang pada/tmp
; jika demikian, Anda dapat menunjuk area lain untuk file sementara dengan variabel lingkunganTMPDIR
, atau flag-T=<tmpdir>
Jawaban:
GNU
sort
(yang merupakan standar pada kebanyakan sistem Linux), memiliki--parallel
opsi. Dari http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :Karena cpu Anda memiliki 2 core, Anda dapat melakukan:
Lebih baik untuk menentukan jumlah core yang sebenarnya karena mungkin ada lebih karena prosesor memiliki hyper-threading .
Anda juga dapat bereksperimen dengan
nice
untuk mempengaruhi prioritas penjadwalan prosesor danionice
untuk mempengaruhi penjadwalan I / O. Anda dapat meningkatkan prioritas daripada proses lain seperti ini, saya tidak berpikir ini akan memberi Anda penghematan besar karena biasanya lebih baik untuk memastikan proses latar belakang tidak menggunakan terlalu banyak sumber daya. Anda dapat memadukannya dengan sesuatu seperti:Perhatikan juga bahwa ketika Gilles berkomentar, menggunakan perintah penyortiran GNU tunggal akan lebih cepat daripada metode lain untuk memilah penyortiran karena algoritma sudah dioptimalkan untuk menangani file besar. Hal lain kemungkinan akan memperlambat segalanya.
sumber
sort
secara langsung lebih baik daripada apa pun yang Anda bisa lakukan. GNU sort dirancang untuk mengatasi dengan baik file yang jauh lebih besar dari RAM.Menggunakan
sort
perintah mungkin akan menjadi opsi tercepat.Tetapi Anda mungkin ingin memperbaiki lokal ke C.
sort -u
tidak melaporkan garis unik, tetapi satu dari setiap rangkaian garis yang sama. Di C locale, 2 baris yang berbeda tentu tidak mengurutkan yang sama, tapi itu tidak terjadi di sebagian besar lokal berbasis UTF-8 pada sistem GNU.Juga, menggunakan lokal C menghindari overhead karena harus mengurai UTF-8 dan memproses pesanan sortir yang kompleks sehingga akan meningkatkan kinerja secara dramatis.
Begitu:
Anda juga dapat meningkatkan kinerja dengan menggunakan drive yang lebih cepat (atau drive yang berbeda dari drive tempat file input dan / atau output) untuk file sementara (menggunakan
-T
atau$TMPDIR
variabel lingkungan), atau dengan mengutak-atik-S
opsi yang didukung oleh beberapasort
implementasi) .Untuk beberapa jenis input atau penyimpanan lambat, menggunakan
--compress-program
opsi GNUsort
(misalnya denganlzop
) dapat meningkatkan kinerja selain penggunaan penyimpanan.sumber
Berikut ini adalah skrip bash yang siap digunakan untuk menyortir data skala TB pada mesin reguler dengan beberapa ram RAM: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Ini memeriksa jumlah core mesin Anda sebagai dan menggunakan semua core. Dapat mengurutkan, angka atau file string. Dapat digunakan untuk menemukan catatan unik dalam data skala TB.
sumber