1

大きなファイル (~ 1 GB) または多数の小さなファイル (~ 30 MB) を転送するために Go Gob を使用しています。サーバーはループで実行されており、クライアントがファイルを送信するとファイルを受信します。

大きなファイルを 1 つ送信するか、小さなファイルをいくつか送信する場合、コードは機能しますが、大きなファイルを 2 回目に送信すると、「致命的なエラー: ランタイム: メモリ不足」が返されます。大きなファイルを送信してプログラムを停止し、再度起動して別の大きなファイルを送信すると、動作します。

Gob経由でファイルを受信して​​ファイルに書き込んだ後、メモリを解放していないように見えます。

サーバーコード

type FileGob struct {
  FileName    string
  FileLen     int
  FileContent []byte
}

func handleConnection(conn net.Conn) {
  transf := &FileGob{}
  dec := gob.NewDecoder(conn)
  err := dec.Decode(transf)       // file from conn to var transf
  if err != nil {
    fmt.Println("error to decode into buffer:", err)
  }

  conn.Close()
  file, err := os.Create("sent_" + transf.FileName)
  if err != nil {
    fmt.Println("error to create file:", err)
  }
  file.Write(transf.FileContent)     // writes into file

  fileStat, err := file.Stat()
  if err != nil {
    fmt.Println("error to get File Stat:", err)
  }

  file.Close()
  fmt.Printf("File %v was transferred\n", transf.FileName)
  fmt.Printf("Transferred: %d, Expected: %d\n", fileStat.Size(), transf.FileLen)
}
4

0 に答える 0