요즘 개인적인 개발로 https://yiunsr.tistory.com/792이것을 하고 있다. 이 동작중에 하나는 csv 파일을 읽어서 sql 에 insert 하는 동작을 한다. 처음에는 electronjs 에서 사용할 것이기 때문에 nodejs 를 사용했다. 그러나 속도가 생각보다 나오지 않아서 go 를 사용해서 새롭게 개발하고 있다. 

 내부적인 동작이 조금 복잡한데, CSV 파일의 encoding 을 자동으로 분석해서(utf8 인지 euc-kr 인지 아니면 기타 encoding 인지 자동으로 detect 한다. ), utf8 로 변환시키고 sqlite3에 insert 하는 동작을 한다. 이 동작이 nodejs 에서는 초당 만(10K) 건이 겨우 넘는 수준이었다. 여러 옵션을 섞어 받지만 초당 3만건 정도가 한계였다. 언어를 Golang 으로 변경 했더니 초당 75K 건이 나왔다. 이 옵션은 https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite 를 참고했다. 

 내 경우 아래 코드를 사용했다. 

db.Exec("PRAGMA synchronous = OFF")
db.Exec("PRAGMA journal_mode = MEMORY")
db.Exec("PRAGMA cache_size = 10000")
db.Exec("PRAGMA locking_mode = EXCLUSIVE")
db.Exec("PRAGMA temp_store = MEMORY")

 

그리고 여러 insert code 는 한번의 트랜잭션으로 동작해야 한다. 이 부분을 적용한 것이 속도 개선에 엄청난 차이가 있다. insert 코드 전에는 꼭 Prepare 코드를 사용해서 코드를 만든 후 사용했다. 이것도 속도의 엄청난 개선을 주었다. 

 테이블을 만들 때, inter primary key 를 만들었다. 이 primary key 가 없으면 자동으로 _rowid 가 추가된다고 한다. 그리고 auto increment 를 사용하지 않았다. 수동으로 증가하는 integer 를 전달하는게 조금 더 빨랐다.

그리고 시도는 해보지 않았지만, 하나의 insert query 에 values 를 여러가 넣는것도 시도해볼만 할 것 같다. 

INSERT INTO table1 (column1,column2 ,..) 
VALUES  
   (value1,value2 ,...), 
   (value1,value2 ,...), 
    ... 
   (value1,value2 ,...); 

 

 예전 대학시절이에는 프로그래밍 언어를 1년에 하나씩 배우는 것이라고 생각했던 적이 있다. 자주 읽던 프로그래밍 관련 책에서 그렇게 나와서 저런 생각을 했고, 그 때는 나에게는 프로그래밍은 취미였기 때문에 재미있게 느껴졌던 것도 있다. 그리고 절대적인 시간도 많았고, 머리도 지금보다 더 잘 돌아갔다. (물론 그 때도 나자신에게 돌머리라고 생각했는데. 돌이켜 생각해 보면 실력은 그 때가 더 좋았던 것 같다. 다만 경험이 없었을 뿐이고. ) 

 그런데 이제는 주력 언어가 중요하고 공부해야 할 것이 언어만 있는 것도 아니고 플랫폼도 익혀야 하고 딥러닝도 공부하고 싶고, 이미지 쪽도 좀 공부하고 싶고.... 배운 언어도 버전업 되어서 계속 익혀야 하는 문제도 있고, 프로그래밍 방법론도 다양해 지면서 이것도 익혀야 하고, 등등의 문제로 많은 언어를 배우는게 한계가 있다. 그리고 요즘에는 이미 배운  언어들 때문에 생긴 선입관들이 새로운 언어를 익히기 어렵게한다.  그리고 언어에 대한 나의 철학이 어느정도 정착되면서 이 철학과 벗어난 언어를 습득하는게 어렵기만하다. (Ruby 와 ROR 의 경우 이 철학 때문에 나에게 좀 많이 어렵게 느껴졌다. 그래서 Ruby 습득은 실패한 것 같다. )

그래도 언어 습득은 계속 필요하다. 내가 알고 싶은 자료들이 내가 모르는 언어로 만들어 진 것일 수도 있고, 새로운 영감을 얻기에도 좋다. 그리고 특정 언어가 가지고 있는 특수한 편리함도 있다. 

어째든 이제 나도 2번째 언어가 필요한 것 같다. 내 모국어는 C 언어 였으나, 이제는 파이썬을 더 많이 사용하고 있다. 그리고 버전업된 C를 많이 접하지 못했다. C를 읽기는 하겠으나 쓰지는 못하겠다. Javascript + HTML + CSS 는 나의 1.5번째 언어이다. 첫번째라고 할 수는 없지만 2번째 라고 하기에는 너무 가깝다. 다만 Nodejs 도 해보고 싶긴하나 잘 적응이 안되더라. 그래도 잠시 관심을 딴데 두고 있다고 다시 관심을 가지면 좋은 툴들이 나와서 나를 편하게 해줄 것 같긴한다. 

자바는 내 첫번째 언어였으나(처음에 프로그램 언어를 접할 때 javascript 를 배우고 싶었으나 java 와 javascript 차이를 알지 못해 java 를 조금 익힌 적이 있다. ) 너무 방대해서 익히기 너무 어렵다. 그래도 필요할 때 간단히 java 프로그램을 짤 수 있으니 이것으로 만족하겠다. CPP 은 내가 첫 직장에서 사용했던 언어이나 너무 많은 버전 업으로 인하여 내가 CPP를 아는게 맞는지 혼동스럽다. 그리고 C나 CPP은 플랫폼을 너무 타서 나에게 너무 힘들다. 

 그래서 이런 저런 이유로 남는 것이 Go lang 이다. 적당히 native 언어이고, 적당히 유연하다. 그리고 개발환경도 어느 정도 세팅되었다. VSCode 로 개발할 만하다.

앞으로 조금씩 Go lang 을 익혀서 속도가 필요한 부분에는 Go lang 을 사용해 봐야겠다. 

 요즘, 파이썬에도 async 바람이 불고 있는 것 같다. (어쩌면 오래 전부터 인지도 모른다. 다만 내가 좀 늦었던 것 같다.) 
Web Framework Benchmark 사이트에서 파이썬 서버로 상위권을 유지하고 있는 vibora(https://github.com/vibora-io/vibora ),  japronto(https://github.com/squeaky-pl/japronto) 을 조금 살펴 보았다.  

 둘다 async 기반이다. 핵심코드가 C로 이루어져 있었다. 그리고 안타깝게 프로젝트가 멈춰있었다. 

 확실히 요츰 추세는 async 기반인 것 같다. 내 머리속으로 상상코딩을 해보았을 때, 하나의 웹페이지가 보여지기 위해서는 여러번의 query 가 필요하다. (물론 내가 다루는 웹은 admin 시스템일 경우가 많다. ) 그리고 일반적인 시스템은 DB 서버와 웹서버가 분리되어 있다. (물론 내가 다루는 시스템은 한 서버에 둘다 있다. 나도 좀 풍족하게 시스템을 구성 하고는 싶다.) . 웹서버가 DB서버에 쿼리는 하나만 보내면 웬지 손해같다. 독립적인 쿼리를 2~3개 보내에 쿼리 결과를 기다리는 시간이 단축될 것이다. 

 그리고 놀라운 것은 핵심코드가 C 로 되어 있는 것이다. 예전부터 파이썬하면 들었던 이야기가 파이썬은 glue language 라서 다른 언어와 결합이 잘 된다는 것이었다. 물론 많은 프로젝트가 C로 만들어진 것이 많다. 파이썬 웹서버도 이젠 C로 만드는 시대가 되는 것인가 하는 생각이 든다.

 다만 안타까운 것은 두 프로젝트가 멈춰있다.  vibora 는 뭔가 다시 만들어지고 있다고 하니 그래도 기다려보면 괜찮은 프로젝트가 나올 것 같다.