Lepaskan ingatan daripada objek besar
Editor PHP Youzi memperkenalkan anda kepada teknik untuk mengoptimumkan penggunaan memori - membebaskan memori daripada objek besar. Semasa proses pembangunan, kami sering mencipta beberapa objek besar, seperti tatasusunan besar atau hasil pertanyaan pangkalan data yang besar, dan objek ini mengambil banyak sumber memori. Apabila kita selesai menggunakan objek ini, ia adalah tabiat pengaturcaraan yang baik untuk melepaskan memori dalam masa. Artikel ini akan menunjukkan kepada anda cara mengosongkan memori daripada objek besar untuk meningkatkan prestasi dan kecekapan aplikasi.
Kandungan soalan
Saya terjumpa sesuatu yang saya tidak faham. Harap anda semua boleh membantu!
Sumber:
- https://medium.com/@chaewonkong/solving-memory-leak-issues-in-go-http-clients-ba0b04574a83
- https://www.golinuxcloud.com/golang-garbage-collector/
Saya membaca dalam beberapa artikel bahawa kami boleh memudahkan tugas gc dengan menetapkan kepingan besar dan peta (saya rasa ini terpakai kepada semua jenis rujukan) kepada nil
selepas kami tidak memerlukannya lagi. Ini salah satu contoh yang pernah saya baca:
func ProcessResponse(resp *http.Response) error { data, err := ioutil.ReadAll(resp.Body) if err != nil { return err } // Process data here data = nil // Release memory return nil }
Seperti yang saya faham, apabila fungsi processresponse
完成时,data
变量将超出范围,基本上将不再存在。然后,gc 将验证是否没有对 []byte
切片(data
menunjuk kepada rujukan kepada kepingan), ingatan akan dikosongkan.
Tetapkan data
设置为 nil
Bagaimana untuk menambah baik kutipan sampah?
Terima kasih!
Penyelesaian
Seperti yang telah dinyatakan oleh orang lain: menetapkandata = nil
不会改变 gc 方面的任何内容。 go 编译器将应用优化,并且 golang 的垃圾收集器在不同的阶段工作。用最简单的术语(有许多遗漏和过度简化):设置 data = nil
sebelum kembali, dan mengalih keluar semua rujukan kepada kepingan asas tidak mencetuskan pelepasan memori gaya atom yang tidak lagi dirujuk. Sebaik sahaja hirisan tidak lagi dirujuk, ia ditandakan sedemikian dan memori yang berkaitan tidak dikeluarkan sehingga imbasan seterusnya.
Pengumpulan sampah adalah masalah yang sukar, terutamanya kerana ia bukan jenis masalah yang mempunyai penyelesaian optimum yang menghasilkan hasil terbaik untuk semua kes penggunaan. Masa jalan pergi telah banyak berkembang selama bertahun-tahun, dan kerja penting dilakukan pada pengumpul sampah masa jalan. Hasilnya ialah, dalam kes yang jarang berlaku, somevar = nil
yang mudah akan membuat walaupun kecil, apatah lagi perbezaan yang ketara.
Jika anda sedang mencari beberapa petua jenis peraturan mudah yang mungkin memberi kesan kepada overhed masa jalan yang dikaitkan dengan kutipan sampah (atau pengurusan memori masa jalan secara amnya), saya tahu bahawa ayat ini nampaknya merangkumi samar-samar dalam ayat anda. soalan:
Adalah dicadangkan agar kita dapat memudahkan kerja gc dengan menyediakan kepingan besar dan pemetaan
Ini boleh menghasilkan hasil yang ketara apabila menganalisis kod. Dengan mengandaikan anda sedang membaca sejumlah besar data yang perlu diproses, atau anda perlu melakukan beberapa jenis operasi kelompok lain dan memulangkan hirisan, bukan perkara biasa bagi orang untuk menulis sesuatu seperti ini:
func processstuff(input []sometypes) []resulttypes { data := []resulttypes{} for _, in := range input { data = append(data, processt(in)) } return data }
Mudah untuk dioptimumkan dengan menukar kod kepada:
func processstuff(input []sometypes) []resulttypes { data := make([]resulttypes, 0, len(input)) // set cap for _, in := range input { data = append(data, processt(in)) } return data }
Apa yang berlaku dalam pelaksanaan pertama ialah apabila anda menggunakan len
和 cap
为 0 创建一个切片。第一次调用 append
anda melebihi kapasiti semasa hirisan, yang menyebabkan masa jalan memperuntukkan memori. Seperti yang dijelaskan di sini, pengiraan kapasiti baharu adalah agak mudah, memori diperuntukkan dan data disalin ke atas:
t := make([]byte, len(s), (cap(s)+1)*2) copy(t, s)
Pada asasnya, setiap kali hirisan yang hendak dilampirkan penuh (iaitu len
== cap
)调用 append
时,您将分配一个可容纳: (len + 1) * 2
元素的新切片。知道在第一个示例中 data
以 len
和 cap
== 0 sebagai permulaan, mari lihat maksudnya:
1st iteration: append creates slice with cap (0+1) *2, data is now len 1, cap 2 2nd iteration: append adds to data, now has len 2, cap 2 3rd iteration: append allocates a new slice with cap (2 + 1) *2, copies the 2 elements from data to this slice and adds the third, data is now reassigned to a slice with len 3, cap 6 4th-6th iterations: data grows to len 6, cap 6 7th iteration: same as 3rd iteration, although cap is (6 + 1) * 2, everything is copied over, data is reassigned a slice with len 7, cap 14
Jika struktur data dalam hirisan adalah besar (iaitu banyak struktur bersarang, banyak arahan, dll.), maka pengagihan semula dan penyalinan yang kerap ini boleh menjadi agak mahal. Jika kod anda mengandungi banyak gelung ini, ia akan mula dipaparkan dalam pprof (anda akan mula melihat panggilan mengambil banyak masa gcmalloc
). Selain itu, jika anda sedang memproses 15 nilai input, kepingan data anda akan kelihatan seperti ini:
dataslice { len: 15 cap: 30 data underlying_array[30] }
Ini bermakna anda akan memperuntukkan memori untuk 30 nilai apabila anda hanya memerlukan 15, dan anda akan memperuntukkan memori tersebut kepada 4 bahagian yang lebih besar secara beransur-ansur, menyalin data pada setiap pengagihan semula.
Sebaliknya, pelaksanaan kedua akan memperuntukkan kepingan data seperti ini sebelum gelung:
data { len: 0 cap: 15 data underlying_array[15] }
Ia diperuntukkan sekali, jadi tiada peruntukan semula dan penyalinan diperlukan, dan kepingan yang dikembalikan akan menduduki separuh ruang memori. Dalam pengertian ini, kami mula-mula memperuntukkan blok memori yang lebih besar pada permulaan untuk mengurangkan bilangan peruntukan tambahan dan menyalin panggilan yang diperlukan kemudian, yang secara keseluruhan mengurangkan kos masa jalan.
如果我不知道需要多少内存怎么办
这是一个公平的问题。这个例子并不总是适用。在这种情况下,我们知道需要多少个元素,并且可以相应地分配内存。有时,世界并不是这样运作的。如果您不知道最终需要多少数据,那么您可以:
- 做出有根据的猜测:gc 很困难,而且与您不同的是,编译器和 go 运行时缺乏模糊逻辑,人们必须提出现实、合理的猜测。有时它会像这样简单:“嗯,我从该数据源获取数据,我们只存储最后 n 个元素,所以最坏的情况下,我将处理 n 个元素” em>,有时它有点模糊,例如:您正在处理包含 sku、产品名称和库存数量的 csv。您知道 sku 的长度,可以假设库存数量为 1 到 5 位数字之间的整数,产品名称平均为 2-3 个单词长。英文单词的平均长度为 6 个字符,因此您可以粗略地了解 csv 行由多少字节组成:假设 sku == 10 个字符,80 个字节,产品描述 2.5 * 6 * 8 = 120 个字节,以及 ~ 4 个字节表示库存计数 + 2 个逗号和一个换行符,平均预期行长度为 207 个字节,为了谨慎起见,我们将其称为 200。统计输入文件,将其大小(以字节为单位)除以 200,您应该对行数有一个可用的、稍微保守的估计。在该代码末尾添加一些日志记录,比较上限与估计值,然后您可以相应地调整您的预测计算。
- 分析您的代码。有时,您会发现自己正在开发新功能或全新项目,而您没有历史数据可以依靠进行猜测。在这种情况下,您可以简单地猜测,运行一些测试场景,或者启动一个测试环境来提供您的代码生产数据版本并分析代码。当您正在主动分析一两个切片/映射的内存使用/运行时成本时,我必须强调这是优化。仅当这是瓶颈或明显问题时(例如,运行时内存分配阻碍了整体分析),您才应该在这方面花费时间。在绝大多数情况下,这种级别的优化将牢牢地属于微优化的范畴。 坚持80-20原则
回顾
不,将一个简单的切片变量设置为 nil 在 99% 的情况下不会产生太大影响。创建和附加到地图/切片时,更可能产生影响的是通过使用 make()
+ 指定合理的 cap
值来减少无关分配。其他可以产生影响的事情是使用指针类型/接收器,尽管这是一个需要深入研究的更复杂的主题。现在,我只想说,我一直在开发一个代码库,该代码库必须对远远超出典型 uint64
范围的数字进行操作,不幸的是,我们必须能够以更精确的方式使用小数比 float64
将允许。我们通过使用像 holiman/uint256 这样的东西解决了 uint64
问题,它使用指针接收器,并解决shopspring/decimal 的十进制问题,它使用值接收器并复制所有内容。在花费大量时间优化代码之后,我们已经达到了使用小数时不断复制值的性能影响已成为问题的地步。看看这些包如何实现加法等简单操作,并尝试找出哪个操作成本更高:
// original a, b := 1, 2 a += b // uint256 version a, b := uint256.NewUint(1), uint256.NewUint(2) a.Add(a, b) // decimal version a, b := decimal.NewFromInt(1), decimal.NewFromInt(2) a = a.Add(b)
这些只是我在最近的工作中花时间优化的几件事,但从中得到的最重要的一点是:
过早的优化是万恶之源
当您处理更复杂的问题/代码时,您需要花费大量精力来研究切片或映射的分配周期,因为潜在的瓶颈和优化需要付出很大的努力。您可以而且可以说应该采取措施避免过于浪费(例如,如果您知道所述切片的最终长度是多少,则设置切片上限),但您不应该浪费太多时间手工制作每一行,直到该代码的内存占用尽可能小。成本将是:代码更脆弱/更难以维护和阅读,整体性能可能会恶化(说真的,你可以相信 go 运行时会做得很好),大量的血、汗和泪水,以及急剧下降在生产力方面。
Atas ialah kandungan terperinci Lepaskan ingatan daripada objek besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Memori yang tidak mencukupi pada telefon mudah alih Huawei telah menjadi masalah biasa yang dihadapi oleh ramai pengguna, dengan peningkatan dalam aplikasi mudah alih dan fail media. Untuk membantu pengguna menggunakan sepenuhnya ruang storan telefon bimbit mereka, artikel ini akan memperkenalkan beberapa kaedah praktikal untuk menyelesaikan masalah memori yang tidak mencukupi pada telefon mudah alih Huawei. 1. Bersihkan cache: rekod sejarah dan data tidak sah untuk mengosongkan ruang memori dan mengosongkan fail sementara yang dijana oleh aplikasi. Cari "Storan" dalam tetapan telefon Huawei anda, klik "Kosongkan Cache" dan pilih butang "Kosongkan Cache" untuk memadam fail cache aplikasi. 2. Nyahpasang aplikasi yang jarang digunakan: Untuk mengosongkan ruang memori, padamkan beberapa aplikasi yang jarang digunakan. Seret ia ke bahagian atas skrin telefon, tekan lama ikon "Nyahpasang" aplikasi yang ingin anda padamkan, kemudian klik butang pengesahan untuk menyelesaikan penyahpasangan. 3.Aplikasi mudah alih untuk

1. Buka Xiaohongshu, klik Saya di sudut kanan bawah 2. Klik ikon tetapan, klik Umum 3. Klik Kosongkan Cache

Penalaan setempat model kelas DeepSeek menghadapi cabaran sumber dan kepakaran pengkomputeran yang tidak mencukupi. Untuk menangani cabaran-cabaran ini, strategi berikut boleh diterima pakai: Kuantisasi model: Menukar parameter model ke dalam bilangan bulat ketepatan rendah, mengurangkan jejak memori. Gunakan model yang lebih kecil: Pilih model pretrained dengan parameter yang lebih kecil untuk penalaan halus tempatan yang lebih mudah. Pemilihan data dan pra-proses: Pilih data berkualiti tinggi dan lakukan pra-proses yang sesuai untuk mengelakkan kualiti data yang lemah yang mempengaruhi keberkesanan model. Latihan Batch: Untuk set data yang besar, beban data dalam kelompok untuk latihan untuk mengelakkan limpahan memori. Percepatan dengan GPU: Gunakan kad grafik bebas untuk mempercepatkan proses latihan dan memendekkan masa latihan.

Ditulis di hadapan & titik permulaan Paradigma hujung ke hujung menggunakan rangka kerja bersatu untuk mencapai pelbagai tugas dalam sistem pemanduan autonomi. Walaupun kesederhanaan dan kejelasan paradigma ini, prestasi kaedah pemanduan autonomi hujung ke hujung pada subtugas masih jauh ketinggalan berbanding kaedah tugasan tunggal. Pada masa yang sama, ciri pandangan mata burung (BEV) padat yang digunakan secara meluas dalam kaedah hujung ke hujung sebelum ini menyukarkan untuk membuat skala kepada lebih banyak modaliti atau tugasan. Paradigma pemanduan autonomi hujung ke hujung (SparseAD) tertumpu carian jarang dicadangkan di sini, di mana carian jarang mewakili sepenuhnya keseluruhan senario pemanduan, termasuk ruang, masa dan tugas, tanpa sebarang perwakilan BEV yang padat. Khususnya, seni bina jarang bersatu direka bentuk untuk kesedaran tugas termasuk pengesanan, penjejakan dan pemetaan dalam talian. Di samping itu, berat

Model bahasa besar sumber terbuka yang biasa seperti Llama3 yang dilancarkan oleh model Meta, Mistral dan Mixtral yang dilancarkan oleh MistralAI, dan Jamba yang dilancarkan oleh AI21 Lab telah menjadi pesaing OpenAI. Dalam kebanyakan kes, pengguna perlu memperhalusi model sumber terbuka ini berdasarkan data mereka sendiri untuk melancarkan potensi model sepenuhnya. Tidak sukar untuk memperhalusi model bahasa besar (seperti Mistral) berbanding model kecil menggunakan Q-Learning pada GPU tunggal, tetapi penalaan halus yang cekap bagi model besar seperti Llama370b atau Mixtral kekal sebagai cabaran sehingga kini . Oleh itu, Philipp Sch, pengarah teknikal HuggingFace

1. Mula-mula, masukkan pelayar Edge dan klik tiga titik di penjuru kanan sebelah atas. 2. Kemudian, pilih [Sambungan] dalam bar tugas. 3. Seterusnya, tutup atau nyahpasang pemalam yang anda tidak perlukan.

Menurut laporan tinjauan TrendForce, gelombang AI mempunyai impak yang besar pada memori DRAM dan pasaran memori flash NAND. Dalam berita laman web ini pada 7 Mei, TrendForce berkata dalam laporan penyelidikan terbarunya hari ini bahawa agensi itu telah meningkatkan kenaikan harga kontrak untuk dua jenis produk storan pada suku ini. Secara khusus, TrendForce pada asalnya menganggarkan bahawa harga kontrak memori DRAM pada suku kedua 2024 akan meningkat sebanyak 3~8%, dan kini menganggarkannya pada 13~18% dari segi memori kilat NAND, anggaran asal akan meningkat sebanyak 13~ 18%, dan anggaran baharu ialah 15%. ~20%, hanya eMMC/UFS mempunyai peningkatan yang lebih rendah sebanyak 10%. ▲Sumber imej TrendForce TrendForce menyatakan bahawa agensi itu pada asalnya menjangkakan untuk meneruskan

Ya, secara keseluruhan, Win11 menggunakan kurang memori daripada Win10. Pengoptimuman termasuk kernel sistem yang lebih ringan, pengurusan memori yang lebih baik, pilihan hibernasi baharu dan proses latar belakang yang lebih sedikit. Ujian menunjukkan bahawa jejak memori Win11 biasanya 5-10% lebih rendah daripada Win10 dalam konfigurasi yang serupa. Tetapi penggunaan memori juga dipengaruhi oleh konfigurasi perkakasan, aplikasi dan tetapan sistem.
