# 텍스트 형식 <- 1줄 짜리 주석
x = 1
y = 2
z = {
a = 1 b = "hello" z = { 1 2 3 4 a = 1 } core = 1 core = 2
}
위처럼 json이랑 약간 비슷한데 json에 한 줄 짜리 주석을 추가하고 object와 array의 구분이 없는 텍스트를
(키?의 중복이 있음, 데이터의 순서가 중요한 텍스트)
파싱하는 파서를 간단하게 만들어봤는데... 조금 느린 것 같아서... 이것저것 해봤는데,
스캐닝 + 파싱, 파싱에 시간이 많이 걸리길래 파싱을 thread를 이용해서 병렬화 해봤는데.. 방법이 맞는지도 잘 모르곘고..
스캐닝은 여전히 느리고.. 스캐닝도 병렬화 해보고 싶은데 혹시 thread?를 이용한 알려진 병렬 스캐닝 방법은 없을까??
(일단 목표는 50MB 파일을 0.1초 정도에 파싱하고 싶어)
결과물이 자료구조로 갖춰져야됨? - dc App
파싱이 끝나면 트리구조?(DOM?) 형태로... 얻고 싶네요 (??)
저 변수는 뭐야 스펙을 모르겟슴 - dc App
EU4txtdate=1947.5.8save_game="Russia1947_05_09.eu4"player="RUS"savegame_versions={ "1.18.1.0" "1.18.2.0" "1.18.3.0" "1.18.4.0" "1.19.1.0"} 원래는 이런 게임데이터이에요
1926.2.10={ leader={ name="Louis de Tréville" type=general manuever=3 fire=3 shock=1 siege=1 activation=1926.2.10 id={ id=19699 type=49 } } }
키=밸류 키=밸류 사이에 공백이 있는거임 아니면 붙어도 되는거이? - dc App
공백이 있어요 ㅠㅠ
밸류는 스트링과 넘버 두개뿐? 그리고 스트링에 이스케이프 있음? , 넘버에는 부동소수점 표현 있음?
https://rakaly.com/blog/a-tour-of-pds-clausewitz-syntax
이걸 보는게 나을듯 ... 스트링에 이스케이프는 못 본 것 같긴함 확신해서 말 못 해주는 게 공식적인 문법?이 잇는게 아니라 유저가 파악해본 문법이라서 그럼..
아 이스케이프 약간 잇는듯...ㅠㅠ;;
Operators 나 The Weeds 는 신경쓰지 않고 파서를 만들어봣음 ㅠㅠ
스펙이 생각보다 복잡한데 json보다 더 예외가 많은듯
파서만들떄는 key = value 과 value 과 key = { } 과 { } 를 다 섞인 형태로 단순화?시켜서 만들어봣음..ㅠㅠ
가장 단순하게 숫자, 날짜 파싱을 안하고 "문자열로만" 생각해서 나중에 필요할때 바꾸어서 쓸수있도록...ㅠㅠ
일단 지금 구현 코드좀
그리고 지금은 얼마나 걸리는데?
50MB 기준 350~600ms ?
코드에는 어떻게든 병렬화를 해놓긴했는데 정석적인? 병렬 스캐닝 방법을 알고싶어서...
지금 어떤식으로 했는지는 모르겠는데 매번 할당하고 있으면 그거만 잘라서 넣는걸로 바꾸면 3배정도는 될거같음
BNF문법이라든지 중첩이 가능한 경우는 이전상태를 보고 다른 상태로 진행되기 때문에 병렬로 하기 힘듬, IO단에서 여러파일을 동시에 돌리는정도, 성능 올리려면 스캐닝할때 브랜치를 극단적으로 줄이고 전부 테이블로 구성해서 돌리는 식으로 해야됨
equal class 를 두는 방법이 있는데 이건 한 character를 읽을때 256개 배열을 만든뒤에 ' ' \t \n 등등 공백문자는 뭐 1로 표시하고 = 는 2번 { 는 3번 } 4번 두어서 해당 캐릭터가 어느 클래스에 속하는지 정의할수 있음
해당 댓글은 삭제되었습니다.
UserType이 좀 잡다한 코드가 있어서? 그리고 쓸데없는 코드도 좀있음..ㅠㅠ
아니 근데 간단한 포맷이라면서요 어케 2300줄이 나옴 simdjson보다 몇배 많네
ㅠㅠ
토큰들을 나누는 코드 + 각 토큰 묶음마다 파싱하는 코드 + 각각의 파싱트리를 합치는 코드 <- 부수적으로 코드가 좀 들어가는듯 ㅠㅠ
그리고 실력부족한것도 있어서 ㅠㅠ
힘 안들이고 자를수 있는 포맷이면 몰라도 자를려고 분석해야하는 포맷이면 걍 싱글로 돌리는게 나을듯
당장 json도 simd는 써도 멀티스레드는 본적이 없다
https://news.hada.io/topic?id=2728
simdjson 내용도 링크 들어가면 볼 수 있어!!
이렇게 위치 따닥 정해져있는 포맷이면 가능하지 ㅇㅇ
그럼 멀티쓰레드 를 이용한 알려진? 병렬 스캐닝 방법은 없는건가요?
휴리스틱?