30GB (2,500 만 행)의 거대한 파일을 읽으려고합니다. 스레드 풀을 생성하고 각 스레드가 병렬로 1000 줄을 읽도록 코드를 작성하려고합니다 (첫 번째 스레드는 처음 1000 줄을 읽고 두 번째 스레드는 다음 1000을 읽습니다). 전체 파일을 읽고 스레드 풀을 만들었지 만 각 스레드가 1000 줄만 읽도록하고 다음 스레드를 읽을 필요가 없도록 읽은 줄 번호를 추적 할 수있는 방법을 고수했습니다. 그 라인들. 이 모든 스레드가 라인의 거의 동일한 번호가 acceaptable의 경우멀티 스레딩을 사용하여 30GB 파일 읽기
답변
A. 수행 할 수 있습니다
- 스레드 풀 크기가 N 인 가정, 1 스레드, 30기가바이트/N을 0 오프셋 파일 및 [0을 읽을 추구), 두 번째 스레드는 30GB/N 오프셋, 30GB/N, 30GB/N * 2 등을 읽으려고합니다.
- 두 번째 스레드는 줄의 시작 부분이 아니라 줄 중간 부분에있을 수 있습니다. 괜찮아. 문장을 건너 뛰고 전체 줄을 읽으십시오. 첫 번째 스레드는 부분 행으로 끝날 수 있습니다. 괜찮습니다. '\ n'을 읽을 때까지 계속 읽으십시오. 나머지 스레드는 동일한 작업을 수행합니다. 모든 스레드가 줄 정확히 euqal 수 있어야하는 경우
B., 즉 당신이 1000 선을 말할 수있다 :
- 인덱스 맵을 구축, 하나 개의 스레드가 전체 파일을 읽게한다. 이 맵은 line0 ~ line999가 오프셋 0에서 시작하고 line1000 ~ line1999가 오프셋 13521에서 시작하는 등의 정보를 가지고 있습니다.
- 모든 스레드는 그에 따라 오프셋에서 파일을 읽고 1000 행을 읽습니다.
접근법 A는 파일을 1 번 읽습니다. 접근법 B는 파일을 2 번 읽습니다.
접근 방식 A 또는 B를 사용하면 모든 스레드가 파일을 처리 (변환, 압축 풀기, 정리) 할 수 있습니다. 그러나 처리 속도가 매우 빠르면 한계는 디스크 속도입니다. 그런 다음 응용 프로그램이 IO 바운드입니다. 하나의 스레드가 파일을 읽고 직렬로 처리해야합니다.
접근법 B는 내가 추구 한 논리이지만 스레드간에 이미 읽혀진 행 번호 공유 문제로 인해 상륙했습니다.파일을 읽는 단일 스레드는 파일 내용을 대기열에 넣은 다음 특정 줄에 대한 대기열을 읽는 것과 동시에 스레드 안전 카운터를 유지하여 이미 읽은 행을 나타 내기가 번거로워집니다. –
"첫 번째 스레드는 먼저 읽습니다. 1000 lines "줄의 그룹을 함께 처리해야한다고 생각했습니다. 그러한 제약이 없다면 첫 번째 작은 N (1, 2, ok) 행을 읽고 첫 번째 스레드에주고 두 번째 작은 N 행을 두 번째 스레드에 제공하십시오. – waltersu
@ChristineDsouza 이미 접근 방법이 있습니다. 스레드 안전 문제에 대한 코드와 질문 만 표시하십시오. – waltersu
- 1. Matlab에서 매우 큰 텍스트 파일 읽기 (~ 30Gb)
- 2. 멀티 스레딩을 사용하여 합계 계산
- 3. 멀티 스레드를 사용하여 파일 읽기
- 4. C에서 버퍼 및 멀티 스레딩을 사용하여 텍스트 파일에서 읽기
- 5. NSEnumerationConcurrent가 멀티 스레딩을 보장합니까?
- 6. C# 멀티 스레딩을 사용하여 파일을 처리하는 방법
- 7. PHP5는 멀티 스레딩을 지원합니까?
- 8. DBCP - 멀티 스레딩을 지원합니까?
- 9. 멀티 스레딩을 어떻게 추가합니까?
- 10. Webservice에서 멀티 스레딩을 지원합니까?
- 11. 트리거에서 멀티 스레딩을 처리하십시오.
- 12. .net을 사용하여 멀티 스레딩을 배우기에 좋은 소스입니까?
- 13. exe에서 멀티 스레딩을 사용하여 문제가 발생했습니다
- 14. 멀티 스레딩을 사용하여 MySQL DB에 연결
- 15. 멀티 스레딩을 사용하여 서버에 여러 요청 보내기
- 16. 안드로이드에서 멀티 스레딩을 사용하여 이미지를로드하는 중
- 17. C++에서 멀티 스레딩을 사용하여 다각형 그리기
- 18. opengles에서 멀티 스레딩을 사용하여 화면 렌더링
- 19. 멀티 스레딩을 사용하여 GDI + 그래픽 개체 그리기
- 20. 멀티 스레딩을 사용하여 UIView 이미지 캡처
- 21. 멀티 스레딩을 사용하여 iphone에 로그인 하시겠습니까?
- 22. 어떻게 단일 스레드를 사용하여 멀티 스레딩을 수행합니까?
- 23. 멀티 스레딩을 사용하여 리소스를 잠그는 방법은 무엇입니까?
- 24. 멀티 스레딩을 사용하여 C#으로 OCR 수행
- 25. 멀티 스레딩을 사용하여 Canvas에서 그리는 방법은 무엇입니까?
- 26. 멀티 스레딩을 사용하여 프로그램이 훨씬 느려짐
- 27. PHP에서 멀티 스레딩을 사용하는 방법
- 28. 멀티 스레딩을 사용하는 바이너리 검색
- 29. 멀티 스레딩을 잘못보고 있습니까? (자바)
- 30. 콘솔에서 멀티 스레딩을 제어하는 방법
일단 문제를 해결하면 자기 드라이브를 사용하고 있습니까? 그럼에도 불구하고 이것은 IO 경계가 될 것입니다. –
하나의 쓰레드가 큰 쓰레기 (30GB)를 읽는 것은 일반적으로 25000 쓰레드가 작은 쓰레기를 읽는 것보다 빠릅니다. 25000 개의 스레드에 많은 오버 헤드가 있으며, 1 개의 디스크에있는 1 개의 파일 인 경우 각 스레드는 큐에있는 액세스 시간을 기다려야합니다. –
보통 하나의 스레드 만 파일과 같은 외부 리소스를 조작해야합니다. 성능을 향상시키지 않는 I/O를 배포하는 대신 독자 스레드가 각 번들을 동시 대기열에 게시하거나 실행자 작업으로 보내도록합니다. – chrylis