大きなファイル (~ 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)
}