from concurrent.futures import ProcessPoolExecutor
import tarfile, rapidgzip
def processNdjson(ndjsonName):
with rapidgzip.open(inTarDir) as myZip:
myZip.import_index(rapidgzipDir)
with tarfile.open(fileobj=myZip, mode="r:*") as f:
member = f.getmember(ndjsonName)
dataFile = f.extractfile(member)
for oneLine in dataFile:
# process oneLine here
if __name__ == "__main__":
inTarDir = ...
rapidgzipDir = ...
nCore = 5
ndjsonNames = ["name1.ndjson", "name2.ndjson"]
with ProcessPoolExecutor(nCore) as pool:
results = pool.map(worker, ndjsonNames)
— это файл преиндекса, который будет использоваться RapidGZIP. Это обеспечивает быстрый произвольный доступ и является прямой заменой встроенного в Python gzip.GzipFile.
with rapidgzip.open(inTarDir) as myZip:
myZip.import_index(rapidgzipDir)
with tarfile.open(fileobj=myZip, mode="r:*") as f:
Мое беспокойство: каждая команда myZip.import_index(rapidgzipDir) будет занимать определенный объем оперативной памяти (например, 500 МБ для файла .tar.gz размером 20 ГБ). Это будет расти линейно с nCore.
Есть ли способ избежать многократного импорта одного и того же RapidgzipDir?
У меня есть файл Python: [code]from concurrent.futures import ProcessPoolExecutor import tarfile, rapidgzip
def processNdjson(ndjsonName): with rapidgzip.open(inTarDir) as myZip: myZip.import_index(rapidgzipDir) with tarfile.open(fileobj=myZip, mode="r:*") as f: member = f.getmember(ndjsonName) dataFile = f.extractfile(member) for oneLine in dataFile: # process oneLine here
with ProcessPoolExecutor(nCore) as pool: results = pool.map(worker, ndjsonNames) [/code] Выше, [list] [*][code]inTarDir[/code] — это каталог файла .tar.gz, содержащего несколько файлов .ndjson. [*][code]rapidgzipDir[/code] — это файл преиндекса, который будет использоваться RapidGZIP. Это обеспечивает быстрый произвольный доступ и является прямой заменой встроенного в Python gzip.GzipFile. [*]Каждый процесс будет [/list] [code]with rapidgzip.open(inTarDir) as myZip: myZip.import_index(rapidgzipDir) with tarfile.open(fileobj=myZip, mode="r:*") as f: [/code] Мое беспокойство: каждая команда myZip.import_index(rapidgzipDir) будет занимать определенный объем оперативной памяти (например, 500 МБ для файла .tar.gz размером 20 ГБ). Это будет расти линейно с nCore. Есть ли способ избежать многократного импорта одного и того же RapidgzipDir?