Saya memiliki file teks dengan kata di setiap baris, ukuran file adalah 800GB. Saya perlu mengurutkan kata-kata berdasarkan abjad.
Saya telah mencoba menggunakan program pengurutan Windows menggunakan:
sort.exe input.txt /o output.txt
yang memberikan kesalahan: Memori utama tidak cukup untuk menyelesaikan penyortiran.
Saya memiliki 32GB RAM, jadi ketika saya mencoba menentukan memori 10GB untuk jenis menggunakan:
sort.exe input.txt /o output.txt /M 10000000
Saya mendapat:
Peringatan: ukuran memori yang ditentukan dikurangi menjadi memori halaman yang tersedia.
Catatan input melebihi panjang maksimum. Tentukan maksimum yang lebih besar.
Apa saja pilihan saya?
Jawaban:
Apa saja pilihan saya?
Coba Freeware Command Line Sort Utility CMSort .
Ini menggunakan beberapa file sementara dan kemudian menggabungkannya di akhir.
Satu pengguna melaporkan itu mengurutkan file 130.000.000 byte.
Jika Anda ingin mengubah beberapa kode sendiri, ada juga Menyortir File Teks Besar - CodeProject - "Algoritma pengurutan garis dalam ukuran file teks yang melebihi memori yang tersedia"
sumber
--parallel
opsi jika Anda memiliki lebih dari satu inti ...)?Satu opsi lain adalah memuat file ke dalam Database. EG MySQL dan MySQL Workbench.
Database adalah kandidat yang sempurna untuk bekerja dengan file besar
Jika file input Anda hanya berisi kata-kata yang dipisahkan oleh baris baru, ini tidak akan sulit.
Setelah Anda menginstal database dan MySQL Workbench, inilah yang perlu Anda lakukan.
Pertama buat skema (ini mengasumsikan kata-kata tidak akan lebih dari 255 karakter meskipun Anda dapat mengubah ini dengan meningkatkan nilai argumen). Kolom pertama "idwords" adalah kunci utama.
Kedua mengimpor data: EG Ini akan mengimpor semua kata ke dalam tabel (langkah ini mungkin memakan waktu beberapa saat untuk menyelesaikan. Saran saya adalah untuk menjalankan tes dengan file kata-kata kecil terlebih dahulu dan setelah Anda yakin formatnya sama dengan yang lebih besar (memotong tabel .. IE Bersihkan dan muat kumpulan data lengkap).
Tautan ini dapat membantu mendapatkan format yang tepat untuk memuat. https://dev.mysql.com/doc/refman/5.7/en/load-data.html
EG Jika Anda perlu melewati baris pertama Anda akan melakukan hal berikut.
Akhirnya Simpan file yang diurutkan. Ini mungkin memakan waktu cukup lama juga tergantung pada komputer Anda.
Anda juga dapat mencari data sesuka Anda. EG Ini akan memberi Anda 50 kata pertama dalam urutan menaik (mulai dari 0 atau kata pertama).
Semoga beruntung
Pete
sumber
mywords
akan memakan waktu selamanya. Bahkan denganLIMIT
itu, itu akan memakan waktu selama semuanya karena MySQL harus melalui setiap nilai tunggalmywords
dan memesannya. Untuk memperbaikinya, Anda harus melakukan yang berikut setelah selesaiLOAD DATA
. Tambahkan indeks kemywords
. Sekarang Anda dapat memesan dengan kolom itu dan tidak memerlukannya milenium. Dan itu adalah lebih baik untuk menambahkan indeks setelah memuat data daripada pada saat Anda buat tabel (lebih cepat beban data).sort
Ada banyak algoritma yang digunakan untuk mengurutkan file yang dipesan dan yang tidak diurutkan [ 1 ] .
Karena semua algoritme sudah diterapkan, pilih program yang sudah diuji.
Dalam coreutils (dari Linux tetapi juga tersedia untuk windows [ 2 ] ), ada
sort
perintah yang mampu berjalan secara paralel di bawah prosesor multi-core: biasanya itu sudah cukup.Jika file Anda sangat besar, Anda dapat membantu pemrosesan splitting (
split -l
), file dalam beberapa chunks, mungkin menggunakan opsi paralel (--parallel
), dan mengurutkan chunks yang dipesan dengan-m
opsi ( merge sort ).Salah satu dari banyak cara untuk melakukannya dijelaskan di sini (membagi file, memesan satu potongan, menggabungkan potongan yang dipesan, menghapus file temp).
Catatan:
(Misalnya semacam gelembung adalah algoritma paling cepat untuk file yang sudah dipesan - tepatnya N -, tetapi tidak efisien dalam kasus lain).
sumber
Untuk menawarkan solusi alternatif untuk Peter H, ada program q yang memungkinkan perintah gaya SQL terhadap file teks. Perintah di bawah ini akan melakukan hal yang sama (dijalankan dari command prompt di direktori yang sama dengan file), tanpa perlu menginstal SQL Workbench atau membuat tabel.
c1
adalah singkatan untuk kolom 1.Anda dapat mengecualikan kata duplikat dengan
dan mengirim output ke file lain
sumber
Jika kata-kata pada setiap baris berasal dari kosakata terbatas (seperti bahasa Inggris) maka Anda dapat mengurutkan daftar dalam waktu O (n + m log m) menggunakan TreeMap dan mencatat jumlah (di mana m adalah jumlah nilai unik).
Kalau tidak, Anda bisa menggunakan big-sorter perpustakaan java . Ini membagi input untuk mengurutkan file menengah dan menggabungkannya secara efisien (keseluruhan O (nlogn)). Untuk mengurutkan file Anda terlihat seperti ini:
Saya membuat file 1.7GB (100m baris) dengan 16 kata karakter yang dihasilkan secara acak dan mengurutkannya seperti di atas pada tahun 142-an dan berdasarkan pada kompleksitas komputasi O (n log n) yang saya gunakan, saya memperkirakan 800GB kata-kata 16 karakter akan butuh sekitar 24 jam untuk mengurutkan single-threaded di laptop i5 2.3GHz saya dengan SSD.
sumber