Необъяснимое потребление дискового пространства при запуске программы Go для вставки 5 миллионов строк в MySQLLinux

Ответить Пред. темаСлед. тема
Anonymous
 Необъяснимое потребление дискового пространства при запуске программы Go для вставки 5 миллионов строк в MySQL

Сообщение Anonymous »

У меня возникла проблема с моей программой на Go, которая вставляет 5 миллионов строк случайных данных в базу данных MySQL. Во время работы программы каждую секунду потребляется около несколько сотен мегабайт дискового пространства. Однако после закрытия программы место на диске не освобождается.
Среда:
  • ОС: 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»