JavaHere
2.21K subscribers
250 photos
5 videos
115 files
528 links
Software Engineer @ Google

IT - Lifestyle - Sport
Download Telegram
Optimizatsiya

Google da milliardlab qator kod bor.

Biror ish qilinganda uni testlash shart.

Testlar esa kompyuterda emas cloud'da run bo'ladi.

Biroz kod yozsangiz va uni merge qilmoqchi bo'lsangiz, sizni kodingiz yozilgan fayl ishlatilgan boshqa fayllarni testlari ham avtomatik ishga tushadi.

Bu juda ko'p testlar run bo'ladi degani.

Bir kuni 20 minut kutdim va testlardan bir nechtasi fail bo'ldi (muvafaqqiyatsiz bo'ldi).

To'g'irlab, yana run qildim va bu safar boshqa birlari fail bo'ldi.

Har safar 20 minut kutish (bazan 30) jonga tegdi.

Nega? degan savol berdim.

Birinchi martasida nima xato ketti ekan deb qaragan bo'lsam, ikkinchi safar nega buncha uzoq vaqt run bo'lyabdi deb qaradim.

AI bilan birga kodni titib, 2-3 ta yaxshilasa bo'ladigan joylar topdim.

1. Juda ko'p query'lar for loop da ketma-ket run bo'layotgan edi.
2. Setup qismida 30 ta table ni test qilish uchun 200 ta table yaratilayotgan edi (30 va 200 nisbatni ifodalash uchun, haqiqiy sonlar emas).

Yechimlar:
1. Parallel testlash
2. Setupni faqat kerakli table'larni yaratadigan qilib o'zgartirish.

Va nihoyat 20-30 minutdan -> 4-5 minutga tushdi.

#tajriba

JavaHere
1⚡91
Optimizatsiya 2 (72h -> 1h)

Pipeline bor. Bu pipeline har kuni bir kunlik ma'lumotlarni process qilib turishi kerak edi. Har safar 8 soat run bo'lardi.

U bir databasedan bir nechta table larni olib, birlashtirib, filterlab, boshqa bir databasedagi bir table ga yozadi.

Menga yangi bir column qo'shib uni kerakli ma'lumot bilan to'ldirishimni so'radi.

Shunday qildim, code ham review va approve bo'ldi.

Lekin kod pre-prod environmentga yetganda, naqd 72 soatdan ko'proq ishlab, time out bo'ldi.

Sababi, menga kerakli ma'lumotni query qilish uslubim xato bo'lgan ekan.

Qanday xato? Agar kerakli ma'lumot juda katta bo'lsa uni bir dona query orqali olib kelmasdan, alohida kichik pipeline bilan olib kelinadi.

Menga kerakli ma'lumot kichik (bir necha yuz megabayt) bo'lgani uchun uni batch emas streaming orqali, ya'ni, bitta queryda olib kelinadigan qildik.

Shunda 72h -> 25h bo'ldi.

Lekin bu ham yaxshi natija emasdi.

Hammani o'zini ishi bor, buniyam kimdir to'g'irlash kerak.

2 ta yo'limiz bor edi,
1. Kompyuterlarni kuchaytirish (cpu, ram)
2. Kodni optimizatsiya qilish

Mendan kodni optimizatsiya qilishimni so'radi.

Muammo - menga kerakli bir necha yuz megabaytli data bilan bir necha terabayatli datani join qilishda edi.

Shu qismini o'zi 17soat olayotgandi.

Men qilgan yechim:
Join qilish o'rniga, haligi kichik datani hashmapga soldim. Terabayt datani parallel yurib chiqib, har bir row uchun o'ziga mos datani hashmapdan olib to'ldirib chiqdim.

Qarasam huddi shunday ishni qilishim mumkin bo'lgan yana bir joy bor ekan. Uniyam shunday qildim.

Natija:
Endi pipeline ~1soat da ishni tugatyabdi, hamma xursand.

Olovni yondirgan menman. Lekin ayb menga yuklanmaydi, sababi jamoam bu kodni review qilib tasdiqlagan. Endi ayb hammaniki.

Optimizatsiyani men qildim, bu jamoaniki emas. Qiziq vaziyat.

Bu ishni qilish davomida Partitioning, Shuffling degan tushunchalar bilan tanishdim.

Balkim bular haqida alohida post yozarman.

Shunday qilib: 72h -> 1h.

Zo'r natija.

#tajriba

JavaHere
17.06.2026
Ishxona, Polsha
⚡78
Join task (updated)

Endigi qilishim kerak bo’lgan ish:

Table A va B.

A table da 50 million atrofida row.
B table da 26 milliard atrofida row.

A tabledagi X columnni B tabledagi X column yordamida to’ldirishim kerak.

A - aID
B - bID

Menda C mapping table bor, yani (aID, bID).

Qiziq task.

Tugatsam qanday qilganimni aytaman.

#tajriba

JavaHere
23.07.2026
Ishxona, Polsha
⚡51