나는 아래와 같은 GES
파일에 코딩 기록이 데이터를 데이터베이스로 가져 오려면 어떻게해야합니까?
Code | Name | Price
00106 | Water | 9.99
00107 | Onion | 8.99
수천 개의 데이터베이스가 :
00F
는 열 머리글00I
수단이
이 행을 삽입 의미 다른 사람도 있습니다 (행을 삭제하려면 00D
또는). 업데이트 용)
00F
0101
02Code
031
00F
0102
02Name
031
00F
0103
02Price
030
00I
0100106
02Water
030999
00I
0100107
02Onion
030899
이 파일을 처리하는 데이터베이스를 만들고 싶습니다. 그래서 다음과 같이 구현하기 시작했습니다 :
class Importer
CONN = ActiveRecord::Base.connection
F = "00F"
I = "00I"
def extract_to_database(collection)
add = true
tmp = []
type = F
inserts = []
collection.each_with_index do |line, i|
_type = line.strip
_changed = [F,I].include? _type
if _changed && i > 0
case type
when F then @f << tmp
when I
group_id = Group.find_by(code: tmp[1]).id
inserts.push "(group_id,'#{tmp[2]}','#{tmp[3]}')"
end
tmp = []
type = _type
end
tmp << line
end
sql = "INSERT INTO products (`group_id`, `name`, `price`) VALUES #{inserts.join(", ")}"
CONN.execute sql
end
end
거기에 한 가지 문제가 있습니다. 기능적인 프로그래밍을 사용하여 그 문제를 리팩터링하고 싶습니다.
code
으로 다른 모델을 찾아 products
열과 관련된 테이블에 넣어야하므로 전체 프로세스가 복잡해질 수 있습니다. 지금이 데이터를 가져 오려면 몇 시간이 걸리기 때문입니다.
아마도 Ruby를 사용하는 것이 최선의 방법이 아닙니다.
프로세스 중 가장 느린 부분을 살펴 보았습니까? 아마 일괄 삽입 SQL 및 여러 작은 버전으로 파일을 분할하고 병렬로 그들을 실행할 수 있습니까? – HariKrishnan
가장 느린 것은 group_id를 찾을 때마다입니다. 나는 그것을 병렬로하고 싶지만 어쩌면 내가 어떻게 나눠야 하는지를 보여줄 수있다. 복사하여 붙여 넣기하여 파일을 수동으로 잘라낼 수 있습니까? – tomekfranek
group_id 조회에 가장 많은 시간이 걸리는 경우 그룹 ID를 redis와 같은 키 값 저장소에 덤프하여 O (1) 조회를 제공 할 수 있습니다. 그것은 일을 더 빨리 만들 수 있습니다.또한 동일한 루프에 삽입하는 대신 동일한 크기의 파일로 입력을 분할하고 각 레코드의 SQL 삽입을 파서로 파서를 통해 실행할 수 있습니다. 그런 다음 insert 문을 대량으로 실행할 수 있습니다. 업데이트 또는 삭제 작업이 있습니까? – HariKrishnan