У меня есть большой CSV-файл, который я хотел бы разделить на число, равное количеству ядер ЦП в системе. Затем я хочу использовать многопроцессорность, чтобы все ядра работали над файлом вместе. Однако у меня возникают проблемы даже с разделением файла на части. Я просмотрел весь google и нашел пример кода, который делает то, что я хочу. Вот что у меня есть до сих пор:
def split(infilename, num_cpus=multiprocessing.cpu_count()):
READ_BUFFER = 2**13
total_file_size = os.path.getsize(infilename)
print total_file_size
files = list()
with open(infilename, 'rb') as infile:
for i in xrange(num_cpus):
files.append(tempfile.TemporaryFile())
this_file_size = 0
while this_file_size < 1.0 * total_file_size / num_cpus:
files[-1].write(infile.read(READ_BUFFER))
this_file_size += READ_BUFFER
files[-1].write(infile.readline()) # get the possible remainder
files[-1].seek(0, 0)
return files
files = split("sample_simple.csv")
print len(files)
for ifile in files:
reader = csv.reader(ifile)
for row in reader:
print row
Два отпечатка показывают правильный размер файла и то, что он был разделен на 4 части (моя система имеет 4 ядра процессора).
Однако последний раздел кода, который печатает все строки в каждой из частей, дает ошибку:
for row in reader:
_csv.Error: line contains NULL byte
Я попытался распечатать строки без запуска функции разделения, и все значения печатаются правильно. Я подозреваю, что функция разделения добавила несколько байтов NULL к результирующим 4 частям файла, но я не уверен, почему.
Кто-нибудь знает, правильный ли это и быстрый способ разбить файл? Мне просто нужны результирующие фрагменты, которые могут быть успешно прочитаны csv.reader.