카테고리 보관물: 미분류

Go언어 csv.gz 한줄씩 읽어오기

Go언어로 CSV파일을 한줄씩 읽어오는 방법입니다.

파일을 메모리에 올려서 한 번에 처리하면 파일이 큰 경우에는 메모리를 다 쓰기 때문에 스왑을 사용해서 문제를 만듭니다.

조금 느리더라도 파일은 1줄씩 읽거나 조금씩 읽어야 합니다.

// csv.gz 파일에서 데이터를 한 줄씩 읽어오는 방법
package main

import (
	"compress/gzip"
	"encoding/csv"
	"fmt"
	"io"
	"log"
	"os"
	"strings"
)

func main() {
	file, err := os.Open("product_titles.csv.gz")

	if err != nil {
		log.Fatal(err)
	}

	defer file.Close()

	gzipReader, err := gzip.NewReader(file)

	if err != nil {
		log.Fatal(err)
	}

	defer gzipReader.Close()

	csvReader := csv.NewReader(gzipReader)
	csvReader.Comma = '\t'
	csvReader.FieldsPerRecord = -1

	for {
		record, err := csvReader.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}

		// 첫번째 필드만 꺼내오기
		fmt.Println("record count:", len(record))
		if len(record) < 1 {
			log.Println("record is empty")
			continue
		}
		field1 := strings.Trim(record[0], " ")
		if len(field1) < 1 {
			log.Println("field1 is empty")
			continue
		}

		fmt.Println("field1:", field1)
	}
}

Nvidia의 각종 AI 데모 사이트 – Nvidia AI demo site

Nvidia의 AI 데모를 볼 수 있는 사이트입니다.

굉장히 재밌는 것들이 많습니다.

사이트주소: https://www.nvidia.com/en-us/research/ai-demos/

NVIDIA GAUGAN2

텍스트를 입력받아서 사진을 생성해줍니다.

단순한 그래픽이 아닌 실사와 다름없는 사실상 실사인 사진를 생성해줍니다.

NVIDIA AI Playground GAUGAN2

LYRICSTUDIO

노래의 가사를 만들어줍니다.

몇개의 단어와 노래를 입력받아 쓸만한 가사를 만들어줍니다.

LyricStudio

NVIDIA VID2VID CAMEO

2D사진을 넣으면 3D 동영상으로 가상의 아바타를 만들어줍니다.

NVIDIA Vid2Vid Cameo

NVIDIA IMAGE INPAINTING

이미지를 강화합니다. 이미지에서 피사체 중 하나를 지우거나 배경을 지울 수 있습니다.

이미지 강화는 여러 용도로 이용할 수 있습니다. 특히 상업용으로 사진을 사용하기 위해서 사진에서 상표나 인물 보기 싫은 대상체를 제거할 수 있습니다.

Image Inpainting

NVIDIA GANIMAL

애완동물의 표정을 다른 동물에게 입힙니다.

재미삼아 만든 것으로 보입니다만 어떤 용도로 쓸 수 있을지 고민을 해봐야 겠습니다.

NVIDIA AI Playground Ganimal

NVIDIA GAMEGAN

스스로 게임하는 인공지능을 만듭니다.

강화학습이라고 부르는 이 인공지능으로 유명한 것은 알파고가 있습니다.

NVIDIA AI Playground GameGAN

Go언어 csv.gz 파일 만들기 – Go writing of csv.gz file

Go언어로 csv.gz 파일을 만드는 코드입니다.

csv는 단순한 텍스트 파일이기 때문에 공간 절약을 위해서 요즘은 데이터 플랫폼들이 csv를 gzip으로 압축한 것을 바로 처리할 수 있도록 지원합니다.

그래서 파일을 만들때 단순한 csv를 만들지 않고 csv를 gzip으로 압축하는 것이 더 유리합니다.

// An example of writing to a csv.gzip compressed file.
package main

import (
	"compress/gzip"
	"encoding/csv"
	"fmt"
	"log"
	"os"
)

func main() {

	csvGzipFile, err := os.Create("output.csv.gz")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer csvGzipFile.Close()

	gzipWriter := gzip.NewWriter(csvGzipFile)
	if err != nil {
		log.Fatal(err)
	}
	defer gzipWriter.Close()

	csvFileWriter := csv.NewWriter(gzipWriter)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer csvFileWriter.Flush()

	records := [][]string{{"item1", "value1"}, {"item2", "value2"}, {"item3", "value3"}}
	for _, record := range records {
		err := csvFileWriter.Write(record)
		if err != nil {
			fmt.Println("Error:", err)
			return
		}
	}
}

Go언어 CSV 파일 쓰기 – Golang writing a csv file

Go언어로 CSV 파일을 만드는 코드입니다.

데이터 과학 업무를 하다보면 데이터처리를 할 때 CSV 파일을 빈번하게 읽거나 만드는 일이 있습니다.

특히 사이즈가 큰 파일은 처리 속도도 매우 중요하기 때문에 Go나 Rust, C++로 처리해야 할 수 있습니다.

Go언어로 CSV 파일을 처리하는 방법을 알아 두면 그럴 때 편하게 쓸 수 있습니다.

package main

import (
	"encoding/csv"
	"fmt"
	"os"
)

func main() {
	csvFile, err := os.Create("output.csv")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer csvFile.Close()

	records := [][]string{{"item1", "value1"}, {"item2", "value2"}, {"item3", "value3"}}

	writer := csv.NewWriter(csvFile)
	for _, record := range records {
		err := writer.Write(record)
		if err != nil {
			fmt.Println("Error:", err)
			return
		}
	}
	writer.Flush()
}

When you work on data science. you frequently deal with CSV files. and sometimes the CSV files are so big. in that case, processing speed is also important.

So you need to know how can you deal with CSV files with high-performance computer languages like Go, Rust, C++.

Go언어 FastText 모델 로딩해서 예측 수행하기 – Golang do prediction with built model

Facebook FastText로 만든 분류모델 (supervised model)을 로딩해서 prediction하는 간단한 코드입니다.

FastText 모델은 Python으로도 로딩해서 사용할 수 있습니다.

하지만 Python은 멀티쓰레드를 사용하기가 어려우니 빠른 속도를 위해서 Go언어나 다른 언어를 써야 할 때가 있으니 알아두면 좋습니다.

// FastText prediction
package main

import (
	"fmt"
	fasttext "github.com/bountylabs/go-fasttext"
)

func main() {
	model := fasttext.Open("//model/fasttext01.bin")
	fmt.Println("Prediction...")
	predictResult, err := model.Predict("분류할 입력 텍스트입니다.")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("Label: %s, Prob: %fs\n", predictResult[0].Label, predictResult[0].Probability)
}

FastText provide a command-line process to make a model. to apply the model to production, you may want write code for processing particular logic.

so, you need to know how cat load prebuilt FastText model and process prediction with Go language