Sayangnya ketika bekerja dengan kumpulan data yang besar akan selalu membutuhkan waktu untuk membuat serial dan deserialize struktur. DataTable
s khususnya adalah objek yang cukup kompleks, karena memiliki baris dan kolom yang sering kali memiliki banyak meta data yang dilampirkan padanya - bahkan jika itu tampak seperti tabel dasar.
DataTable
vs List<POCO>
:
Pertimbangkan apakah Anda benar-benar perlu membuat serialisasi sebagai DataTable
. Bisakah Anda membuat POCO yang lebih sederhana dan membuat serial List<YourRecord>
? Dengan kata lain, jika Anda tidak memerlukan atribut tambahan pada bidang dan kolom dan Anda dapat membuat serial ke format yang lebih sederhana, kemungkinan akan lebih cepat, dan lebih hemat ruang dalam cache; lalu pulihkan ke DataTable
jika perlu.
Pilihan lain adalah untuk membagi DataTable
menjadi set yang lebih kecil, yang Anda ceritakan dan simpan di bagian yang lebih kecil. Anda mungkin menemukan ini lebih berkinerja. Anda harus dapat membandingkan ini.
Tolok ukur:
Pada akhirnya cache Redis Anda harus menjadi peningkatan dari waktu yang dibutuhkan untuk meminta ulang sumber data. Anda menggunakan istilah takes too much time
, tetapi jika dibutuhkan 2 detik untuk mendapatkan dari cache vs 8 detik untuk menanyakan sumber data, maka itu adalah peningkatan yang signifikan. Tetapi satu-satunya cara untuk memastikannya adalah dengan melakukan benchmark.
-
Atur lingkungan Anda sehingga Anda hanya menjalankan alat yang diperlukan. Jangan melakukan tugas lain saat menjalankan tolok ukur, sehingga Anda tidak menimbulkan bias apa pun.
-
Catat waktu yang diperlukan untuk membuat cerita bersambung
DataTable
. Lakukan tindakan ini berkali-kali dan rata-rata.var start = DateTime.Now; // Serialize var duration = DateTime.Now - start;
-
Bereksperimenlah dengan berbagai ukuran
DataTable
s dan lihat apakah Anda menemukan waktu yang dapat diterima. -
Coba perpustakaan serialisasi yang berbeda, seperti JSON.NET. Meskipun bagus untuk menyimpan semuanya ServiceStack, ini dapat membantu Anda menentukan apakah itu kekurangan ServiceStack.Text atau hanya masalah dengan kumpulan data yang besar.
-
Ulangi proses untuk deserialisasi.
Memori:
Jika Anda bekerja dengan kumpulan data yang besar, apakah aplikasi dan cache Anda memiliki memori yang cukup? Memori dalam aplikasi Anda bisa menjadi penghambat; Anda harus memperhatikan monitor aktivitas sistem Anda saat melakukan operasi, dan memastikan Anda tidak kehabisan memori dan membuat sistem Anda melakukan paging. Jika Anda menemukan ini terjadi, pertimbangkan untuk meningkatkan RAM, atau pisahkan DataTable menjadi kumpulan data yang lebih kecil seperti yang disebutkan sebelumnya.
Latensi:
Jika Anda terhubung ke server Redis melalui jaringan, dan bukan pada mesin yang sama, sudahkah Anda memeriksa latensi jaringan? Anda mungkin ingin melakukan ping antara server aplikasi Anda dan server cache dan memastikan Anda benar-benar memiliki ping yang rendah. Terutama jika Anda merasa cache objek sederhana lambat.
Redis?
Jika Anda menemukan tidak ada cara untuk meningkatkan waktu untuk cache dan restore, maka mungkin menggunakan Redis tidak cocok. Mungkin menggunakan static DataTable
dalam memori aplikasi akan lebih cocok. Dengan kata lain, dengan menyimpan cache di memori aplikasi dan kemudian tidak ada serialisasi dan deserialisasi yang perlu dikhawatirkan. Tentu saja Anda mungkin perlu berhati-hati dalam memastikan Anda memiliki cukup memori yang tersedia untuk aplikasi Anda untuk melakukan ini. Namun saya akan terkejut jika Anda harus memilih opsi ini .
Ringkasan:
Tanpa melihat kumpulan data atau pengetahuan Anda tentang layanan yang sedang Anda bangun, pada akhirnya hanya saran umum tentang cara terbaik untuk mempersempit penyebab masalah Anda. Saran utama adalah jangan gunakan DataTable
jika struktur yang lebih sederhana dapat digunakan, dan tolok ukur setiap operasi untuk menentukan hambatan apa pun.
Saya harap ini membantu.