Cara praktis untuk menyimpan jumlah data yang “cukup besar” yang hampir tidak pernah berubah?

13

Pikirkan dalam hal tabel pencarian pra-komputasi atau sesuatu. Pada titik apa lebih masuk akal untuk menggunakan database daripada nilai-nilai hardcoding dalam aplikasi saya? Nilai tidak akan berubah, dan mereka dipisahkan dengan baik dari pengembang pemeliharaan. Nilai 100, 1k, 10k, 100k? Saya ingin menyimpan sekitar nilai 40k. Sekarang ini adalah switchpernyataan yang dibuat oleh mesin (yang VS2010 tidak senang).

edit:

Jika ada yang ingin tahu, inilah cara saya mendekati ini: Data saya dapat disimpan dalam dua array elemen 100k, jadi itulah yang saya lakukan. Butuh sekitar 20 detik untuk menghasilkan data, jadi saya melakukannya sekali, dan membuat serial menjadi sumber daya tertanam dengan BinaryFormatter. Membongkar data membutuhkan waktu sekitar 5 milidetik pada saat startup aplikasi, dan mengungguli implementasi basis data yang saya gantikan (nilai-nilai hard-coded ini disimpan sebelumnya) dengan hampir 45.000x.

Bryan Boettcher
sumber

Jawaban:

5

Saran saya adalah menyimpan data dalam file atau tabel database. Jika kecepatan tidak menjadi masalah, maka permintaan file atau database (database lebih baik) pada saat run time. Jika memori tidak menjadi masalah, tetapi Anda menginginkan kecepatan, maka muat data ke dalam memori saat program dimulai. Di C # Anda bisa menggunakan dan array, daftar atau (opsi terbaik) tabel-hash dan memiliki metode untuk mengembalikan data yang Anda butuhkan saat runtime (yaitu getDataValue (string keyToValue)).

Saya akan merekomendasikan bahwa Anda tidak menggunakan pernyataan switch karena akan sangat sulit untuk mempertahankan dan akan menghasilkan jejak exe yang besar.

Hash-table misalnya http://support.microsoft.com/kb/309357

adam f
sumber
Inilah yang akhirnya saya lakukan: periksa posting saya yang diperbarui.
Bryan Boettcher
1
+1 untuk saran basis data. Database dibuat untuk menyimpan volume data besar dan memungkinkan Anda untuk mengambilnya dengan sangat cepat.
NoChance
Lihat stackoverflow.com/questions/301371/… tentang mengapa lebih baik menggunakan kamus untuk ini daripada hashtable. YMMV
Chris McKee
6

Secara pribadi, saya OK untuk menyimpan sejumlah data, hardcoded ke dalam aplikasi, sampai tidak perlu men-tweak untuk satu penyebaran atau perbaikan terbaru.

Namun, menyimpan dan mengakses data menggunakan pernyataan saklar C #, adalah praktik yang buruk, karena pada pasangan yang ketat menyimpan data dan model akses data dan hanya menyiratkan satu metode metode akses (dengan parameter sakelar).

Saya lebih suka menyimpan data dalam Hashtable atau Kamus, dan menyediakan kelas terpisah untuk mengambil data, dan satu kali mengisi Kamus pencarian.

Baru-baru ini, saya merasa agak nyaman untuk menerapkan DSL kecil untuk menentukan aturan bisnis ( antarmuka yang lancar untuk SiteMap atau kalkulator pajak, cek pertanyaan "calc", metode untuk definisi aturan) dan kemudian menyediakan objek terpisah untuk menanyakan aturan-aturan ini. Teknik ini akan berlaku dengan baik untuk skenario sakelar kasus.

Salah satu manfaat bagus dari dekomposisi tersebut, adalah Anda dapat mengimplementasikan sejumlah Tampilan pada data Anda, tanpa menyentuh gumpalan garis XXXK, yang menentukan data itu.

Valera Kolupaev
sumber
Saya telah memperpanjang jawaban dengan beberapa contoh.
Valera Kolupaev
2

Pernyataan beralih baris 40k sedikit dipertanyakan. Saya menganggap Anda masih perlu melakukan operasi permintaan bukan? Sudahkah Anda mencoba mengenkapsulasi data? Kemudian gunakan LINQ untuk melakukan operasi kueri pada koleksi untuk menguji kinerja. Dapatkan beberapa waktu yang konkret dengan menjalankan unit test dengan timer seperti StopWatch . Kemudian, jika Anda berpikir itu mungkin berhasil. Lihat apakah kinerja dapat diterima oleh pengguna.

P.Brian.Mackey
sumber
2

Saya sudah memiliki persyaratan seperti ini dua kali. Aplikasi dirancang untuk berdiri sendiri tanpa pengaturan / akses basis data. Dalam kedua kasus saya menggunakan file XML untuk menyimpan data. Dalam yang pertama, yang ada di Kerangka 2.0, saya menggunakan panggilan parsing XML gaya lama untuk mencari data. Untuk yang lebih baru, pada Framework 3.5, saya menggunakan LINQ ke XML untuk menemukan apa yang saya butuhkan. Dalam kedua kasus, akses ke data dirangkum dalam kelas.

jfrankcarr
sumber
1

Kuncinya di sini adalah untuk memastikan antarmuka publik Anda merangkum implementasi Anda - tetapi itu bukan pertanyaan Anda dan tidak ada alasan untuk berpikir Anda belum melakukannya. Di luar itu, itu hanya masalah kinerja vs kesedihan (dan perbedaan kinerja mungkin tidak layak untuk diperhatikan). Sebagai solusi praktis, untuk masalah VS 2010, Anda selalu dapat memecah pernyataan kasus menjadi hierarki pernyataan kasus - tingkat teratas dapat memanggil satu dari 10 metode lainnya, masing-masing dengan pernyataan kasus 4000 kasus, misalnya. Anda dapat menempatkan masing-masing dari 10 ke dalam file itu sendiri jika Anda harus. Agak jelek, tetapi Anda tetap menghasilkan kode.

Adapun nomor untuk beralih ke DB-itu saja setiap kali tidak menggunakan DB menjadi masalah.

psr
sumber
Saya menghargai pemikiran bahwa antarmuka saya merangkum implementasi: itu pasti tidak. Fungsionalitas diekspos melalui GetValuesForInputmetode -type, dan pernyataan besar saya tersembunyi dalam implementasi.
Bryan Boettcher
1

Anda bisa menggunakan sesuatu seperti SQL Compact. Masukkan data dalam tabel dan tinggalkan file DB dalam proyek. Tabel lebih cocok untuk jumlah data itu daripada pernyataan switch.

Morgan Herlocker
sumber
1

Saya pikir kata kuncinya di sini adalah 'hampir tidak'

Jika data tidak pernah berubah - misalnya, nilai matematika yang telah dihitung sebelumnya, konstanta warna, dan sejenisnya - maka tentu saja, selama ukurannya dapat dikelola untuk Anda, simpanlah dalam kode. Perlu diketahui bahwa jika kinerja merupakan masalah, pernyataan kasus / pergantian akan sangat lambat dibandingkan dengan opsi lain.

Jika data hampir tidak pernah berubah - misalnya, kode area telepon, batas nasional, dan sejenisnya - saya mungkin akan melihat ke dalam menjaga data secara eksternal dalam beberapa cara. Terutama jika mulai menjadi lebih dari beberapa lusin nilai.

GrandmasterB
sumber
1
Itu tergantung pada seberapa bagus kompilernya. Pernyataan kasus dalam Delphi mungkin sangat efisien.
Loren Pechtel
1

Jika Anda menyimpan sejumlah besar data ke dalam aplikasi Anda, maka program Anda mungkin memuat lebih lambat dan Anda mungkin mengekspos kode untuk risiko jika seseorang dapat bermain dengan binari atau dieksekusi.

Juga, jika program diedit berkali-kali, siapa tahu, mungkin Anda bisa membuat kesalahan dengan salah ketik angka secara tidak sengaja atau sebagai akibat dari perintah perubahan.

Mungkin di masa depan seseorang meminta untuk menjalankan kueri pada data, katakanlah, seseorang mungkin meminta rata-rata, dari kolom, dalam hal ini Anda harus mengubah aplikasi Anda dan menambahkan metode untuk menghitung setiap permintaan yang muncul oleh pengguna Anda dengan, lalu ikuti semua langkah untuk mempromosikan kode Anda ke produksi. Ini benar-benar tidak baik.

Memisahkan data dan kode adalah praktik yang baik khususnya jika datanya besar.

Tidak mungkin
sumber