|
[필독] 처음 오시는 분을 위한 안내 (737) |
정은준1 |
2014-05 |
5269122 |
0 |
2014-05
5269122
1 정은준1
|
|
(광고) 단통법 시대의 인터넷가입 가이드(ver2.0) (234) |
백메가 |
2015-12 |
1794207 |
25 |
2015-12
1794207
1 백메가
|
111025 |
4K 영상 편집용 PC 맞추려고 합니다. 고견 부탁드립니다. (18) |
회원 |
2024-08 |
1686 |
0 |
2024-08
1686
1 회원
|
111024 |
잉거솔 시계 IN2705WHMB 어떨까요? (10) |
현정사랑 |
2012-03 |
9962 |
0 |
2012-03
9962
1 현정사랑
|
111023 |
ipmi도 해킹당하나요? (7) |
행복하세 |
2017-08 |
4023 |
0 |
2017-08
4023
1 행복하세
|
111022 |
120~130도 정도에서 녹는 soldering wire 찾고 있습니다 (1) |
윤경식 |
2015-08 |
3614 |
0 |
2015-08
3614
1 윤경식
|
111021 |
윈도우10 제스처 끄는법 있나요? (3) |
AplPEC |
2017-09 |
4210 |
0 |
2017-09
4210
1 AplPEC
|
111020 |
서버랙에 서버를 어떻게 고정하나요? (7) |
재니짱 |
2020-01 |
6077 |
0 |
2020-01
6077
1 재니짱
|
111019 |
HP DL360 Gen9 서버에 windows os 2008 설치시 레드스크린 (14) |
요를레이 |
2023-01 |
2539 |
0 |
2023-01
2539
1 요를레이
|
111018 |
데이터 무결성을 위해서 gpu ecc도 필요한가요? (7) |
YuPlayer |
2024-09 |
1105 |
0 |
2024-09
1105
1 YuPlayer
|
111017 |
어느 통신회사 셋탑박스 TV 회선 (3) |
뚜뚜김대원 |
2012-04 |
5236 |
0 |
2012-04
5236
1 뚜뚜김대원
|
111016 |
ASUS P5Q보드 개조제온 바이오스 구할 수 있을까요? (2) |
토니스팍 |
2015-08 |
4778 |
0 |
2015-08
4778
1 토니스팍
|
111015 |
esxi 사운드카드 패스쓰루 (2) |
황성진 |
2016-09 |
5745 |
0 |
2016-09
5745
1 황성진
|
111014 |
rtx titan은 여러장 겹쳐쓰면 쓰로틀링 걸릴까요? (8) |
아드레날린 |
2018-12 |
4013 |
0 |
2018-12
4013
1 아드레날린
|
111013 |
Z820 NVME BIOS 부탁드립니다 (6) |
lovemiai |
2024-10 |
1058 |
0 |
2024-10
1058
1 lovemiai
|
111012 |
[Help] Z840 PSU 임대 부탁 드립니다. |
PCMaster |
2023-01 |
1787 |
0 |
2023-01
1787
1 PCMaster
|
111011 |
[끌어올림] IBM Xseres 226 케이스 락키나 열 수 있는 방법 없나요? (3) |
Realwook |
2014-04 |
3401 |
0 |
2014-04
3401
1 Realwook
|
111010 |
ssd이 처음이라서요...제품문의 드립니다.. (11) |
권용1 |
2015-09 |
5290 |
0 |
2015-09
5290
1 권용1
|
111009 |
VGA(RGB) to hdmi convertor 사용시 화면 밀림 (6) |
전승윤 |
2021-06 |
5267 |
0 |
2021-06
5267
1 전승윤
|
111008 |
아이콘 클릭질을 자동화 해주는 스크립트 도구가 윈도에도 있나요? (2) |
김우진 |
2012-05 |
5284 |
0 |
2012-05
5284
1 김우진
|
111007 |
ML110 G7 소음 줄이기? (8) |
쌍cpu |
2015-09 |
7271 |
0 |
2015-09
7271
1 쌍cpu
|
111006 |
sd카드 수명확인하는 방법이 있을까요?? (5) |
라온제나 |
2017-09 |
15536 |
0 |
2017-09
15536
1 라온제나
|
GPT 질의)
Get-Content "./text.txt" | Group-Object | Where-Object { $_.Count -gt 1 } | Select -ExpandProperty Name
1. 전체 라인을 분할해서 4~6스레드정도로 처리 (전체 라인을 카운터해서 필요한 스레드 숫자로 나눈후 시작 지점을 각각 그만큼 더해서 지정)
2. 진척도 표시 및 일시중지 및 계속진행처리 기능 추가
GPT 답변 )
: 먼저, 전체 라인을 분할하여 여러 스레드에서 처리할 수 있도록 작업할 수 있습니다. 이를 위해서는 파일의 전체 라인 수를 세고, 그 수에 따라 적절한 수의 스레드로 분할합니다. 그런 다음, 각 스레드가 처리해야 할 라인 범위를 계산합니다.
#-----------------------------------------
# 파일의 전체 라인 수 계산
$totalLines = Get-Content "./text.txt" | Measure-Object -Line | Select-Object -ExpandProperty Lines
# 사용할 스레드 수 설정 (여기서는 예시로 4~6 사이의 스레드를 사용)
$threadCount = Get-Random -Minimum 4 -Maximum 7
# 각 스레드가 처리할 라인 범위 계산
$linesPerThread = [math]::Ceiling($totalLines / $threadCount)
# 각 스레드의 시작 지점 계산
$threadRanges = @()
$startLine = 1
for ($i = 1; $i -le $threadCount; $i++) {
$endLine = [math]::Min($startLine + $linesPerThread - 1, $totalLines)
$threadRanges += "$startLine-$endLine"
$startLine = $endLine + 1
}
#-----------------------------------------
이제 $threadRanges 배열에는 각 스레드가 처리해야 할 라인의 범위가 저장됩니다.
: 다음으로, 진척도 표시 및 일시중지/계속진행처리 기능을 추가할 수 있습니다. 이를 위해서는 각 스레드가 라인을 처리할 때마다 진행 상황을 표시하고, 필요한 경우 사용자 입력을 받아 작업을 일시 중지하거나 계속 진행합니다.
#-----------------------------------------
# 각 스레드에서 진행 상황을 표시하고 사용자 입력을 처리하는 함수 정의
function ProcessLines {
param (
[string]$range
)
$startLine, $endLine = $range -split '-'
for ($lineNumber = $startLine; $lineNumber -le $endLine; $lineNumber++) {
# 각 라인을 처리하는 작업 수행
# 여기에 실제 작업 내용을 추가
# 진행 상황 표시
Write-Host "Processing line $lineNumber/$totalLines"
# 사용자 입력 확인 (일시 중지 또는 계속 진행)
$key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown").Character
if ($key -eq 'p') {
# 'p' 키를 누르면 일시 중지
Write-Host "작업이 일시 중지되었습니다. 계속하려면 'c'를 입력하세요."
do {
$key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown").Character
} while ($key -ne 'c')
Write-Host "작업을 계속합니다."
}
}
}
# 각 스레드마다 작업 시작
foreach ($range in $threadRanges) {
Start-ThreadJob -ScriptBlock {
param (
[string]$range
)
ProcessLines $range
} -ArgumentList $range
}
# 모든 스레드 작업이 완료될 때까지 대기
Get-Job | Wait-Job
# 모든 작업 완료 후 스레드 종료
Get-Job | Remove-Job
#-----------------------------------------
위의 예제에서는 각 스레드가 각 라인을 처리하는 가상의 작업을 수행하고, 그 과정에서 진행 상황을 표시하고 사용자 입력을 받습니다. 실제 작업에 맞게 스크립트를 수정하십시오.
Where-Object { $_.Count -gt 1 } 는 오히려 별 시간 안걸릴겁니다.
각 단계를 쪼개 변수에 넣고 실행을 하면 오래걸리는 병목이 어디인지 보일겁니다.
a = Get-Content "./text.txt"
b = a | Group-Object
...
import threading
class LineProcessor:
def __init__(self, filename):
self.filename = filename
self.lock = threading.Lock()
self.total_lines = 0
self.processed_lines = 0
self.duplicates = {}
def count_lines(self):
with open(self.filename, 'r') as file:
for line_number, line in enumerate(file, start=1):
self.total_lines += 1
def process_lines(self, start=None, end=None):
with open(self.filename, 'r') as file:
if start:
file.seek(start)
if end:
chunk_size = end - start
else:
chunk_size = os.path.getsize(self.filename)
for _ in range(chunk_size):
line = file.readline()
if not line:
break
self.processed_lines += 1
if line in self.duplicates:
with self.lock:
print(f"Duplicate line '{line.strip()}' found at line number(s): {', '.join(map(str, self.duplicates[line]))}")
else:
self.duplicates.setdefault(line, []).append(self.processed_lines)
def process_chunk(self, start, end):
self.process_lines(start, end)
with self.lock:
print(f"Processed chunk from {start} to {end}. Progress: {self.processed_lines}/{self.total_lines}")
def find_duplicates(filename, num_threads=4):
processor = LineProcessor(filename)
processor.count_lines()
chunk_size = processor.total_lines // num_threads
threads = []
for i in range(num_threads):
start = i * chunk_size
end = (i + 1) * chunk_size if i < num_threads - 1 else None
thread = threading.Thread(target=processor.process_chunk, args=(start, end))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
# print("Duplicate lines found:", processor.duplicates)
if __name__ == "__main__":
filename = "text.txt"
find_duplicates(filename)
나쁘지 않게 결과를 뱉어주네요.