사용자 영향력 프로젝트

[트위터] Main 함수 코드

appendonly 2022. 12. 19.

특성

1. 본래 Neo4j를 활용했으나 데이터를 넣는 것이 Bulk Insert로도 너무나 오래 걸려 그냥 text file의 정보를 사용. 텍스트 파일은 "팔로위 팔로워"처럼 공백으로 나뉜 정보들이 줄로 구분됨.

2. 그래프를 구축할 때는 씨드 사용자들을 일일히 선별함. 약 300명으로 구성된 씨드 사용자들을 선정했으며 토픽의 다양성을 위해 다양한 매체에서 선정한 토픽 별 인플루언서들을 참고함. 토픽마다 어느정도 사용자 수가 수집되면 멈춘다.

3. 정답 셋은 spread score를 기준으로 계산함. Spread score는 참고 논문 중 IC 모델들과 매우 흡사한 결과를 낳는다는 것이 증명되어 정답 셋으로 활용하기 타당함.

4. 전체 데이터 셋은 8만명 이상의 사용자와 1700만개의 관계 수로 구성됨. 팔로위를 따라 그래프를 구축해나갔으며 수집 후 최종적으로 다시 한번 관계를 검사했기에 모든 관계가 반영됐다고 볼 수 있음. 이분 탐색 활용.

5. 그래프를 구축할 때 사이클이 발생하는 것을 방지하기 위해 해시맵에 이미 입력된 사용자 정보를 기록함. 해시맵은 최대 2^32 - 1 개의 키를 가질 수 있다. 해시맵 size() 함수 때문이다.

6. API 토큰은 10개 가량 사용했으며 이 중 개발자 API는 2개 사용함.

7. 그래프를 수집할 때 사용자마다 관계가 5개까지만(큐에 삽입) 반영되지만 파일에 쓰는 것은 모든 관계를 기록한다. 이는 추후 모든 관계를 반영하기 위함이다.

 

모든 file은 속도가 빠른 BufferedReader로 읽는다. FileReader 보다 I/O 요청마다 읽어들이는 크기(버퍼에 저장)가 더 크기 때문에 속도가 더 빠르다.

JavaClass/FileSize 1 MB 10 MB 100 MB 1000 MB Code
FileInputStream 600 ms 4500 ms 41200 ms 425400 ms Link
BufferedInputStream 30 ms 350 ms 3300 ms 32100 ms Link
BufferedReader 60 ms 390 ms 3400 ms 32900 ms Link
Direct BufferedInputStream 50 ms 80 ms 280 ms 3300 ms Link
MappedByteBuffer 20 ms 25 ms 160 ms 1450 ms Link

 

* Main.java과 Main2.java 둘 다 단순히 모든 관계를 반영하기 위한 코드이다.

댓글