Saya mencoba memuat nama gumpalan untuk memfilter dalam program saya, kemudian setelah menerapkan semua filter, saya berencana untuk mengunduh dan memproses setiap gumpalan. Saat ini kami memiliki sekitar 30k gumpalan dalam penyimpanan yang disimpan di dalam wadah seperti ini: tahun/bulan/hari/jam/file.csv (atau file.json untuk file yang belum diproses)

Program saya perlu memasukkan tanggal mulai dan berakhir secara dinamis (lama maksimal 30 hari) untuk mengunduh. Menggunakan Azure.Storage.Blobs.BlobContainerItem dan metode GetBlobs memungkinkan saya menggunakan awalan string tunggal untuk penyaringan sisi server.

Jika tanggal saya adalah 2020/06/01 dan 2020/06/02, program bekerja sangat cepat dan membutuhkan waktu sekitar 2 detik untuk mendapatkan gumpalan dan menerapkan filter lainnya. Namun, jika saya memiliki 2020/05/30 dan 2020/06/01 maka saya tidak dapat memasukkan awalan bulan karena hanya membutuhkan 1 string sehingga awalan saya hanya 2020, yang membutuhkan waktu sekitar 15 detik untuk menyelesaikannya. Pemfilteran lainnya dilakukan secara lokal tetapi penundaan terbesar adalah fungsi GetBlobs() .

Apakah ada cara lain untuk menggunakan beberapa sisi server filter dari aplikasi .NETCore?

Berikut adalah fungsi yang relevan:

        BlobContainerClient container = new BlobContainerClient(resourceGroup.Blob, resourceGroup.BlobContainer);
        var blobs = container.GetBlobs(prefix : CreateBlobPrefix(start, end))
            .Select(item=> item.Name)
            .ToList();
        blobs = FilterBlobList(blobs, filter, start, end);

    private string CreateBlobPrefix(DateTime start, DateTime end)
    {
        string prefix = null;
        bool sameYear = start.Year == end.Year;
        bool sameMonth = start.Month == end.Month;
        bool sameDay = start.Day == end.Day;
        if (sameYear)
        {
            prefix = start.Year.ToString();
            if (sameMonth)
            {
                if(start.Month<10)
                    prefix += "/0" + start.Month.ToString();
                else
                    prefix += "/" + start.Month.ToString();
                if (sameDay) 
                    if(start.Day<10)
                        prefix += "/0" + start.Day.ToString();
                    else
                        prefix += "/" + start.Day.ToString();
            }
        }
        return prefix;

EDIT: inilah cara saya melakukannya pada akhirnya. Karena lebih cepat membuat banyak permintaan dengan awalan yang ditentukan lebih baik, saya melakukan hal berikut:

  • buat daftar tanggal berbeda di jendela waktu yang dipilih (berasal dari aplikasi UI tempat pengguna memasukkan jendela apa pun)
  • untuk setiap awalan yang dibuat, saya mengirim permintaan ke Azure untuk mendapatkan gumpalan
  • gabungkan semua nama gumpalan menjadi 1 daftar
  • memproses daftar dengan menggunakan klien blob untuk setiap nama blob

Berikut kodenya:

        foreach (var blobPrefix in CreateBlobPrefix(start, end))
        {
            var currentList = container.GetBlobs(prefix: blobPrefix)
                .Select(item => item.Name)
                .ToList();
            blobs = blobs.Concat(currentList).ToList();
        }
1
spoon252 20 November 2020, 12:22

1 menjawab

Jawaban Terbaik

Anda dapat memfilter lebih dari sekali, menemukan penyebut yang sama di antara tanggal:

Filter pertama dengan awalan string berdasarkan bulan dan tahun mulai, 2020/05, lalu filter secara lokal untuk tanggal pastinya.

Kemudian Anda dapat meningkatkan filter hari/bulan secara bertahap hingga Anda mencapai akhir rentang.

Perincian langkah Anda sangat bergantung pada waktu yang diperlukan untuk melakukan panggilan ke Azure untuk jumlah hasil rata-rata tertentu. Keuntungan lain adalah Anda dapat menjalankan sub-kueri ini secara paralel.

Saya telah menggunakan kode ini:

    var prefixDateFilters = Enumerable.Range(0, 1 + endDateInclusive.Subtract(startDateInclusive).Days)
                                      .Select(offset => startDateInclusive.AddDays(offset))
                                      .Select(date => $"{date.ToString(BlobFileDateTimeFormat)}").ToList();

    prefixFilters.AsParallel()
                 .Select(filter => containerClient.GetBlobs(prefix: filter))
1
Alenros 23 Desember 2020, 12:19