@Tomlak Мне удалось изменить ваш код и заставить его работать, большое спасибо за помощь, которую я не смог бы сделать без вашей помощи, и очень ценю вашу помощь и руководство, код, возможно, можно немного очистить, но Я не могу найти никаких недостатков в данных после нескольких дней тестирования. Я запустил его для файла объемом 3,6 ГБ, который произвел около 6,5 миллионов строк в таблице files_index и 7,4 миллиона строк в таблице product_ids, так что теперь у меня есть почти миллион потенциальных скусов, с которыми я потенциально могу сопоставить данные.
Я изменил его, чтобы он также добавил строку в таблицу product_ids, даже если нет дочернего узла M_Prod_ID с идентификатором продукта и Prod_ID, поэтому было проще создать представление, соответствующее данным. КОД НИЖЕ .......
> Blockquote$connectionString = "Data Source=Apps2\Apps2;Initial
Catalog=ICECATtesting;Integrated Security=SSPI"
$batchSize = 100000
# set up [files_index] datatable & read schema from DB
$files_index_table = New-Object System.Data.DataTable;
$files_index_adapter = New-Object System.Data.SqlClient.SqlDataAdapter("SELECT * FROM
files_index WHERE 0 = 1", $connectionString)
$files_index_adapter.Fill($files_index_table) | Out-Null;
$files_index_bcp = New-Object System.Data.SqlClient.SqlBulkCopy($connectionString)
$files_index_bcp.DestinationTableName = "dbo.files_index"
$files_index_count = 0;
# set up [product_ids] datatable & read schema from DB
$product_ids_table = New-Object System.Data.DataTable
$product_ids_adapter = New-Object System.Data.SqlClient.SqlDataAdapter("SELECT * FROM
product_ids WHERE 0 = 1", $connectionString)
$product_ids_adapter.Fill($product_ids_table) | Out-Null
$product_ids_bcp = New-Object System.Data.SqlClient.SqlBulkCopy($connectionString)
$product_ids_bcp.DestinationTableName = "dbo.product_ids"
$product_ids_count = 0
# main import loop
$xmlReader = New-Object System.Xml.XmlTextReader("C:\Scripts\icecat\files.index.xml")
while ($xmlReader.Read()) {
# skip any XML nodes that aren't elements
if ($xmlReader.NodeType -ne [System.Xml.XmlNodeType]::Element) { continue }
# handle <file> elements
if ($xmlReader.Name -eq "file") {
$files_index_count++
# remember current product ID, we'll need it when we hit the next <M_Prod_ID>
element also add the Prod_ID from the file node
$curr_product_id = $xmlReader.GetAttribute("Product_ID")
$curr_prod_id = $xmlReader.GetAttribute("Prod_ID")
$is_new_file = $false
$newRow = $files_index_table.NewRow()
$newRow["Product_ID"] = $xmlReader.GetAttribute("Product_ID")
$newRow["path"] = $xmlReader.GetAttribute("path")
$newRow["Updated"] = $xmlReader.GetAttribute("Updated")
$newRow["Quality"] = $xmlReader.GetAttribute("Quality")
$newRow["Supplier_id"] = $xmlReader.GetAttribute("Supplier_id")
$newRow["Prod_ID"] = $xmlReader.GetAttribute("Prod_ID")
$newRow["Catid"] = $xmlReader.GetAttribute("Catid")
$newRow["On_Market"] = $xmlReader.GetAttribute("On_Market")
$newRow["Model_Name"] = $xmlReader.GetAttribute("Model_Name")
$newRow["Product_View"] = $xmlReader.GetAttribute("Product_View")
$newRow["HighPic"] = $xmlReader.GetAttribute("HighPic")
$newRow["HighPicSize"] = $xmlReader.GetAttribute("HighPicSize")
$newRow["HighPicWidth"] = $xmlReader.GetAttribute("HighPicWidth")
$newRow["HighPicHeight"] = $xmlReader.GetAttribute("HighPicHeight")
$newRow["Date_Added"] = $xmlReader.GetAttribute("Date_Added")
$Firstproduct_id = $xmlreader.GetAttribute("Product_ID")
$Firstprod_id = $xmlreader.GetAttribute("Prod_ID")
$newfilenode = $true
$files_index_table.Rows.Add($newRow) | Out-Null
$newRow = $product_ids_table.NewRow()
$newRow["Product_ID"] = $curr_product_id # from above
$newRow["Alternative_ID"] = $curr_prod_id
$product_ids_table.Rows.Add($newRow) | Out-Null
if ($files_index_table.Rows.Count -eq $batchSize) {
$files_index_bcp.WriteToServer($files_index_table)
$files_index_table.Rows.Clear()
Write-Host "$files_index_count <file> elements processed so far"
}
# handle <M_Prod_ID> elements
} elseif ($xmlReader.Name -eq "M_Prod_ID") {
$product_ids_count++
# add self-reference row to the [product_ids] table also I added the Prod_ID
from the file node so I can make a view to match all variants
# only for the first <M_Prod_ID> per <file> we need to do this
$xmlreader.read()
$newRow = $product_ids_table.NewRow()
$newRow["Product_ID"] = $curr_product_id # from above
$newRow["Alternative_ID"] = $xmlReader.Value
$product_ids_table.Rows.Add($newRow) | Out-Null
if ($product_ids_table.Rows.Count -eq $batchSize) {
$product_ids_bcp.WriteToServer($product_ids_table)
$product_ids_table.Rows.Clear()
Write-Host "$product_ids_count <M_Prod_ID> elements processed so far"
}
}
}
# write any remaining rows to the server
if ($files_index_table.Rows.Count -gt 0) {
$files_index_bcp.WriteToServer($files_index_table)
$files_index_table.Rows.Clear()
}
Write-Host "$files_index_count <file> elements processed overall"
if ($product_ids_table.Rows.Count -gt 0) {
$product_ids_bcp.WriteToServer($product_ids_table)
$product_ids_table.Rows.Clear()
}
Write-Host "$product_ids_count <M_Prod_ID> elements processed overall"
array($stmt, 'bindparams')
- это способ PHP идентифицировать метод bind_params для объекта $ stmt
, так как PHP 5 вы не используете больше не нужно использовать &
впереди (а mysqli - это PHP 5, так что в старом посте это похоже на сбой).
вы можете увидеть похожий пример здесь
поэтому
call_user_func_array(array($stmt, 'bindparams'), $array_of_params);
в основном означает
$stmt->bind_params($array_of_params[0], $array_of_params[1] ... $array_of_params[N])
Разница между WaitForMultipleObjects () и портами завершения ввода / вывода заключается в том, что IOCP масштабируется до тысяч объектов, тогда как WFMO ( ) не может и не должен использоваться для чего-то большего, чем 64 объекта (даже если бы вы могли).
Вы не можете реально сравнить их по производительности, потому что в области <64 объектов они будут практически идентичны.
Однако WFMO () выполняет циклический перебор для своих объектов, поэтому занятые объекты с низкими индексными номерами могут истощать объекты с высокими индексными номерами. (Например, если объект 0 постоянно отключается, он будет голодать от объектов 1, 2, 3 и т. Д.). Это, очевидно, нежелательно.
Я написал библиотеку IOCP (для сокетов) для решения проблемы C10K и поместил ее в общественное достояние. Я смог на 512 Мб W2K-машине получить 4000 сокетов, одновременно передавая данные.
Выражение $ userid == "ALL"
будет вычислено как логическое значение, которое будет передано в bind_param
. Мы не можем сказать bind_param
, что параметр является логическим (строка формата понимает только строку, int, double и blob), поэтому bind_param преобразует логическое значение в int, что работает для нас.
Пока в базе данных нет ни user_id, ни location_id, все в порядке.
Пока в базе данных нет ни user_id, ни location_id, все в порядке.
Пока в базе данных нет ни user_id, ни location_id, все в порядке.