Среда:
- ОС: Ubuntu
- IDE: GoLand (устанавливается через Snap)
- База данных: MySQL 8, работающая в контейнере Docker
- Модули Go: GORM для ORM
Во время выполнения программы , мое дисковое пространство быстро расходуется (несколько ГБ в секунду). После остановки программы (я закрыл ее вручную примерно за 1 минуту) занятое место на диске не освобождается. Однако проверка размеров контейнера MySQL Docker, таблиц MySQL и пакета Snap не выявила аномального роста.
Вот код Go, который я использую:
Код: Выделить всё
package main
import (
"fmt"
"gorm.io/gorm/logger"
"log"
"math/rand"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// Post represents the posts table in the database
type Post struct {
ID int `gorm:"primaryKey;autoIncrement"`
AuthorID int `gorm:"not null"`
Content string `gorm:"not null"`
LikeCount int `gorm:"default:0"`
CommentCount int `gorm:"default:0"`
}
// GenerateRandomString generates a random string of the given length
func GenerateRandomString(length int) string {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))
b := make([]byte, length)
for i := range b {
b[i] = charset[seededRand.Intn(len(charset))]
}
return string(b)
}
func main() {
// Database connection details
dsn := "test:test@tcp(127.0.0.1:9174)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Error),
})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
// Migrate the schema
err = db.AutoMigrate(&Post{})
if err != nil {
log.Fatalf("Failed to migrate database schema: %v", err)
}
// Insert 5 million rows
totalRows := 5000000
batchSize := 1000
contentLength := 10000 // Adjust this length based on your requirements
// Start a new random seed
rand.Seed(time.Now().UnixNano())
for i := 0; i < totalRows; i += batchSize {
var posts []Post
for j := 0; j < batchSize; j++ {
posts = append(posts, Post{
AuthorID: rand.Intn(1000) + 1, // Random author_id between 1 and 1000
Content: GenerateRandomString(contentLength),
LikeCount: rand.Intn(1000), // Random like_count between 0 and 999
CommentCount: rand.Intn(1000), // Random comment_count between 0 and 999
})
}
// Batch insert
if err := db.Create(&posts).Error; err != nil {
log.Fatalf("Failed to insert batch: %v", err)
}
fmt.Printf("Inserted %d rows\n", i+batchSize)
}
fmt.Println("Finished inserting 5 million rows")
}
- Проверен размер контейнера MySQL Docker.
- Проверил размер каталога данных MySQL.
- Проверил размер пакета Snap для GoLand.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -million-r