Это наивный подход (1 Гб):
package main
import (
"fmt"
"log"
"os"
)
func main() {
myfile, err := os.OpenFile("myfile", os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
log.Fatal(err)
}
defer myfile.Close()
var pos int
var line string
// sample: login:jbill:2013/3/25, 1
line = fmt.Sprintf("%s:%s:%s, %d\n", "login", "jbill", "2013/3/25", 1)
for pos < 1024*1024*1024 {
bytes, err := myfile.Write([]byte(line))
if err != nil {
log.Fatal(err)
}
pos = pos + bytes
}
}
который берет навсегда (1:16), потому что выход не буферизирован. Добавляя bufio вы можете уменьшить время резко
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
myfile, err := os.OpenFile("myfile", os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
log.Fatal(err)
}
defer myfile.Close()
mybufferedfile := bufio.NewWriter(myfile)
var pos int
var line string
// sample: login:jbill:2013/3/25, 1
line = fmt.Sprintf("%s:%s:%s, %d\n", "login", "jbill", "2013/3/25", 1)
for pos < 1024*1024*1024 {
bytes, err := mybufferedfile.WriteString(line)
if err != nil {
log.Fatal(err)
}
pos = pos + bytes
}
err = mybufferedfile.Flush()
if err != nil {
log.Fatal(err)
}
}
Еще 26 сек на моей машине, я хотел бы видеть более быстрое решение.
КСТАТИ: вам нужно сделать случайных полей, рабочих, но что остается в качестве упражнения для читателя :)
насчет отметка времени и номер в конце, должны ли они оставаться неизменными? Каков допустимый диапазон этих двух, если они должны измениться на каждой записи? – topskip
@ user1361315 Где моя проблема? Я не вижу этого. – nemo
@topskip timestamp может быть любым допустимым временем в 2012 году. Номер может быть любым случайным числом между 1-100. – loyalflow